Pip inside dockerfile under proxy

2019-04-24 18:17发布

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...

4条回答
可以哭但决不认输i
2楼-- · 2019-04-24 18:21

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 .
查看更多
Animai°情兽
3楼-- · 2019-04-24 18:33

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 .
查看更多
再贱就再见
4楼-- · 2019-04-24 18:34

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.

查看更多
Melony?
5楼-- · 2019-04-24 18:44

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/

查看更多
登录 后发表回答