Pip inside dockerfile under proxy

2019-04-24 18:01发布

问题:

I am trying to build a Docker image for elasticsearch-curator,

Here is the dockerfile:

FROM alpine:3.7

RUN adduser -S curator

RUN apk add --update \
    python \
    python-dev \
    py-pip \
    build-base \
  && pip install virtualenv \
  && pip install elasticsearch-curator \
  && rm -rf /var/cache/apk/*

USER curator

ENTRYPOINT [ "/usr/bin/curator"]

Thing is I am under a proxy, so I must build my image with:

docker build  --no-cache --build-arg HTTP_PROXY=http://xx.xx.xx.xx:xx -t elasticsearch-curator:5.4 .

But when it wants to get virtualenv, I get:

Collecting virtualenv
  Retrying (Retry(total=4, connect=None, read=None, redirect=None)) after connection broken by 'ConnectTimeoutError(<pip._vendor.requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x7fb8259ed350>, 'Connection to pypi.python.org timed out. (connect timeout=15)')': /simple/virtualenv/
  Retrying (Retry(total=3, connect=None, read=None, redirect=None)) after connection broken by 'ConnectTimeoutError(<pip._vendor.requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x7fb8259ed210>, 'Connection to pypi.python.org timed out. (connect timeout=15)')': /simple/virtualenv/

I found people solving issue inserting

ENV http_proxy http://proxy-chain.xxx.com:911/
ENV https_proxy http://proxy-chain.xxx.com:912/

in the Dockerfile, but it is not possible for me, because my proxy is only valid on my building, so if another person from another place want to build the image, he will need to remove http_proxy env var from Dockerfile.

Is there any other way to achieve it? It seems like a very common use case...

回答1:

I solved it by adding HTTPS_PROXY in command line:

docker build  --no-cache --build-arg HTTP_PROXY=http://xx.xx.xx.xx:xx --build-arg HTTPS_PROXY=http://xx.xx.xx.xx:xx -t elasticsearch-curator:5.4 .


回答2:

Don't include the proxy settings in the Dockerfile.

If you have configured the proxy settings correctly on the host machine, you can build the docker image with --network= host. This will make the build command use the network settings of the host.

docker build  --no-cache --network=host -t elasticsearch-curator:5.4 .


回答3:

I think this is because pip install needs explicit proxy arg.

Try to make an install.sh to pip installs.

If there's a proxy configured (passed as build-arg, i.e. set int the environment), install it with :

pip install --proxy=https://user@mydomain:port virtualenv

With env variable:

pip install --proxy=$HTTP_PROXY virtualenv

If not, pip install without proxy.



回答4:

You can configure all clients proxies via the ~\.docker\config.json file in your home or user directory directory:

{ 
  "credsStore": "wincred",
  "auths": {},
  "stackOrchestrator": "swarm",
  "proxies":
  {
   "default":
   {
    "httpProxy": "http://127.0.0.1:3001",
    "noProxy": "*.test.example.com,.example2.com"
   }
  }
}

The first three entries are there by default, simply add the "proxies" section to your file.

Source: https://docs.docker.com/network/proxy/