百胜更新 / APK 更新 / APT-get 更新在代理后面不起作用



我在代理后面,我无法构建 Docker 映像。

我尝试了FROM ubuntuFROM centosFROM alpine,但apt-get update/yum update/apk update失败了。

我的主机操作系统是 Windows 10,所以我将 Docker 设置配置为使用我们的代理。

我还添加了

ENV http_proxy http://<PROXY>
ENV https_proxy http://<PROXY>

到我的 Dockerfile,但没有成功。

我也尝试将我的代理设置为http://<USER>:<PASS>@<PROXY>,但同样没有成功。

我能够拉取 Docker 映像。当我将代理设置设置为代理时,我无法拉取图像,因此我想我的代理 URL 是正确的。

有什么想法我还能尝试吗?

编辑:

我还尝试将我们的 DNS 服务器(列在ipconfig /all下)添加到 Docker 设置中,但同样没有成功。

编辑2:我刚刚意识到我忘记了Ubuntu Docker文件中的">http://"。添加这个之后,docker build现在可以在 ubuntu 上运行良好 - 但仅适用于ubuntu。它仍然不适用于centosalpine.

这是我所有的 3 个 Dockerfile:

乌班图:

FROM ubuntu
ENV http_proxy "http://<MY-PROXY>"
ENV https_proxy "http://<MY-PROXY>"
RUN apt-get update

CentOS:

FROM centos
ENV http_proxy "http://<MY-PROXY>"
ENV https_proxy "http://<MY-PROXY>"
RUN yum update 

高山:

FROM alpine
ENV http_proxy "http://<MY-PROXY>"
ENV https_proxy "http://<MY-PROXY>"
RUN apk update 

错误消息:

CentOS:

Step 4/4 : RUN yum update
---> Running in 3deecb71823d
Loaded plugins: fastestmirror, ovl
One of the configured repositories failed (Unknown),
and yum doesn't have enough cached data to continue. At this point the only
safe thing yum can do is fail. There are a few ways to work "fix" this:
[...]
Cannot find a valid baseurl for repo: base/7/x86_64

高山:

Step 4/4 : RUN apk update
---> Running in 76c8579734cf
fetch http://dl-cdn.alpinelinux.org/alpine/v3.6/main/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.6/main: could not connect to server (check repositories file)
WARNING: Ignoring APKINDEX.84815163.tar.gz: No such file or directory
fetch http://dl-cdn.alpinelinux.org/alpine/v3.6/community/x86_64/APKINDEX.tar.gz
2 errors; 11 distinct packages available
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.6/community: could not connect to server (check repositories file)
WARNING: Ignoring APKINDEX.24d64ab1.tar.gz: No such file or directory
The command '/bin/sh -c apk update' returned a non-zero code: 2

将 http(s)_proxy 设置为系统范围的变量是非常糟糕的主意。 U 只需要使该包管理器通过代理工作。 如果您仍然想设置HTTP_proxy请不要忘记no_proxy否则您的所有流量都将尝试通过代理主机。 对于 ubuntu,我更喜欢使用这样的东西

FROM ubuntu
ARG PROXY=false
ARG PROXY_URL="http://proxy:8080"
RUN if [ "$PROXY" = true ] ; then echo 'Acquire::http::Proxy "'$PROXY_URL'";' >> /etc/apt/apt.conf ; fi && 
apt-get update && 
apt-get install -y vim

并在没有互联网连接的服务器上像这样执行它,但本地执行将在没有代理的情况下工作

docker build -t ubuntu-with-proxy --build-arg PROXY=true .

Centos 还可以处理 yum.conf 中的代理配置

FROM centos
ARG PROXY=false
ARG PROXY_URL="http://proxy:8080"
RUN if [ "$PROXY" = true ] ; then echo 'proxy="$PROXY_URL";' >> /etc/yum.conf ; fi && 
yum install -y vim

并在没有互联网连接的服务器上像这样执行它,但本地执行将在没有代理的情况下工作

docker build -t centos-with-proxy --build-arg PROXY=true .

但是我找不到这样的高山解决方案,我认为可以用这个在阿尔卑斯山
实现类似 Centos/Ubuntu 的解决方案,但我还没有测试过这个。

FROM alpine
ARG PROXY=false
ARG PROXY_URL="http://proxy:8080"
RUN if [ "$PROXY" = true ] ; then echo "http_proxy = $PROXY_URL" > /etc/wgetrc && echo "use_proxy = on" >> /etc/wgetrc ; fi && 
apk add -U vim

再次执行

docker build -t alpine-with-proxy --build-arg PROXY=true .

对于 CentOS,我明确地必须输入我的代理端口80并删除http://部分。 因此,对于 CentOS,一个有效的解决方案如下所示(如果代理在端口 80 上运行):

FROM centos
ENV http_proxy=<My-PROXY>:80
ENV https_proxy=<My-PROXY>:80
RUN yum update

阿尔卑斯山仍然不见了,看起来需要额外的线路:

ENV HTTP_PROXY_AUTH=basic:*:<USER>:<PASS>

但对我不起作用。可能是因为我的密码中存在特殊字符,请参阅:https://github.com/gliderlabs/docker-alpine/issues/305

如果我找到解决方案,我会更新这个答案。

编辑: 对于高山,我使用这个:

FROM alpine
ENV http_proxy=http://<My-PROXY>:80/
ENV https_proxy=http://<My-PROXY>:80/
RUN apk update

您是否在RUN apt-get update指令之后设置了ENV http_proxy指令?

它们应该在使用之前进行设置,因为 docker 从 docker 文件从上到下构建映像。

我们在高山和 apk 更新中遇到了同样的问题。 毕竟解决方案显得微不足道。看起来apk需要大写代理变量和代理服务器地址中的http://

FROM alpine:3.8
ENV HTTP_PROXY http://proxyserver:proxyport
ENV HTTPS_PROXY http://proxyserver:proxyport
RUN apk update 
&& apk add bash

这为我们解决了问题。

对我来说,APK 无法从 Docker 中使用代理,因为我的 CNTLM 代理未绑定到 0.0.0.0(所有接口),因此 Docker 网络接口无法看到它。

我更改了我的 cntlm.conf 文件:

Listen 58888

。自:

Listen 0.0.0.0:58888

(您的端口可能会有所不同)

最新更新