无法在 dockerfile 中设置代理

Joh*_*ohn 6 proxy firewall docker

我无法在公司防火墙后面运行 Docker “入门”示例。在家中无需防火墙即可正常运行。

当我使用 构建图像时docker build -t my_tag .,尝试安装一些 python 包时失败。docker 文件中有这样的命令:

RUN pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

错误信息是:

收集Redis(来自-rrequirements.txt(第1行))在连接因“ProxyError('无法连接到代理。'”而中断后重试(重试(总计= 4,连接=无,读取=无,重定向=无)) NewConnectionError(': 无法建立新连接: [Errno -2] 名称或服务未知',))': /simple/redis/

我尝试在 dockerfile 中设置代理(以各种格式,但它们都失败):

ENV http_proxy http://my_username:my_password@my_host:/80
ENV https_proxy https://my_username:my_password@my_host:/80
ENV HTTP_PROXY http://my_username:my_password@my_host:/80
ENV HTTPS_PROXY https://my_username:my_password@my_host:/80
ENV http_proxy http://my_username:my_password@my_host:80
ENV https_proxy https://my_username:my_password@my_host:80
ENV HTTP_PROXY http://my_username:my_password@my_host:80
ENV HTTPS_PROXY https://my_username:my_password@my_host:80
ENV http_proxy=http://my_username:my_password@my_host:80
ENV https_proxy=https://my_username:my_password@my_host:80
ENV HTTP_PROXY=http://my_username:my_password@my_host:80
ENV HTTPS_PROXY=https://my_username:my_password@my_host:80
Run Code Online (Sandbox Code Playgroud)

我尝试在文件 /etc/systemd/system/docker.service.d/http-proxy.conf 中设置环境:

[Service]
Environment="HTTP_PROXY=http://my_username:my_password@my_host:80/" "HTTPS_PROXY=https://my_username:my_password@my_host:80/"
Run Code Online (Sandbox Code Playgroud)

我尝试更改RUN pip installdockerfile 中的命令,使其还包含代理:

RUN pip install --proxy="my_username:my_password@my_host:80" -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

我尝试在 /etc/default/docker 中设置选项,添加:

DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
Run Code Online (Sandbox Code Playgroud)

我尝试将代理添加到 docker build 命令:

docker build -t python_example_1 --build-arg HTTPS_PROXY=https://my_username:my_password@my_host:80 --build-arg HTTP_PROXY=http://my_username:my_password@my_host:80 .
Run Code Online (Sandbox Code Playgroud)

我在 Linux mint 上使用 docker 版本 1.12.6 运行它。

有人有主意吗?


更新 1:如果我简化 dockerfile,使其使用curl(无 python 或 pip)

FROM ubuntu
WORKDIR /app
ADD . /app
EXPOSE 80

# Define environment variable
ENV http_proxy=http://my_username:my_password@my_host:80
ENV https_proxy=http://my_username:my_password@my_host:80
ENV HTTP_PROXY=http://my_username:my_password@my_host:80
ENV HTTPS_PROXY=http://my_username:my_password@my_host:80

RUN apt-get -qq update
RUN apt-get -qq -y install curl

CMD ["curl www.google.com.au"]
Run Code Online (Sandbox Code Playgroud)

错误消息表明它正在获取代理信息,但存在某种名称解析问题:

Removing intermediate container 945f8123da61
Step 10 : RUN apt-get -qq update
 ---> Running in 99a5bbbb943d
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial/InRelease  Temporary failure resolving 'my_host'
Run Code Online (Sandbox Code Playgroud)

其中“my_host”是正确的代理(顺便说一句,我已经对此进行了测试,并且用户名/密码/代理主机名确实有效)


更新 2 如果我从 docker 文件中删除 ENV,那么现在是:

FROM ubuntu
WORKDIR /app
ADD . /app
EXPOSE 80

ARG http_proxy=http://my_username:my_password@my_host:80
ARG https_proxy=http://my_username:my_password@my_host:80
ARG HTTP_PROXY=http://my_username:my_password@my_host:80
ARG HTTPS_PROXY=http://my_username:my_password@my_host:80

RUN apt-get -qq update
Run Code Online (Sandbox Code Playgroud)

并使用 --build-args 进行构建:

docker build --build-arg HTTPS_PROXY=http://my_username:my_password@my_host:80 --build-arg HTTP_PROXY=http://my_username:my_password@my_host:80 .
Run Code Online (Sandbox Code Playgroud)

错误仍然是Temporary failure resolving 'archive.ubuntu.com'

如果我尝试通过将其放入 docker 文件来添加名称服务器:

RUN echo "nameserver 8.8.8.8" >> /etc/resolv.conf
RUN cat /etc/resolve.conf
Run Code Online (Sandbox Code Playgroud)

错误消息是:

cat: /etc/resolve.conf: No such file or directory
The command '/bin/sh -c cat /etc/resolve.conf' returned a non-zero code: 1
Run Code Online (Sandbox Code Playgroud)

也许这不起作用,因为它正在“中间容器”中创建 /etc/resolv.conf 文件,而该文件在下一步中不可用?较长的输出为:

Removing intermediate container 1f77c03ee8be
Step 5 : RUN echo "nameserver 8.8.8.8" >> /etc/resolv.conf
 ---> Running in e2a9717f6bed
 ---> 13752a04094b
Removing intermediate container e2a9717f6bed
Step 6 : RUN cat /etc/resolve.conf
 ---> Running in 94ce4a72867b
cat: /etc/resolve.conf: No such file or directory
Run Code Online (Sandbox Code Playgroud)

Von*_*onC 0

如果您在正常环境中确实设置了代理(意味着在 docker 构建中没有,但针对您的主机操作系统),请仔细检查其https_proxy值。

URLhttps_proxy应与 URL 相同http_proxy:应以http.
不是 https

首先在简化的 Dockerfile 中进行简单的测试(curl www.google.com例如)
,然后另请参阅pip issues 1805,其中显示了如何pip使用代理。