yum update / apk更新/ apt-get更新不在代理后面工作

时间:2017-10-25 11:12:28

标签: docker proxy dockerfile docker-for-windows

我落后于代理,我无法构建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图像。当我将代理设置设置为无代理时,我无法提取图像,因此我猜我的代理网址是正确的。

任何想法我还能尝试什么?

修改

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

EDIT2: 我刚刚意识到我忘记了我的Ubuntu Dockerfile中的“ http:// ”。添加后,docker build现在适用于ubuntu - 但仅适用于ubuntu 它仍不适用于centosalpine

以下是我的3个Dockerfiles:

Ubuntu的:

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

5 个答案:

答案 0 :(得分:2)

对于CentOS,我明确地必须输入我的代理端口80并删除http:// - 部分。 因此对于CentOS,一个工作解决方案看起来像这样(如果代理在端口80上运行):

FROM centos

ENV http_proxy=<My-PROXY>:80
ENV https_proxy=<My-PROXY>:80

RUN yum update

Alpine仍然缺失,看起来需要额外的一行:

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

答案 1 :(得分:2)

将http(s)_proxy设置为系统范围的变量是一个非常糟糕的主意。 您只需要使程序包管理器的代理工作即可。 如果您仍然想要设置http(s_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 .

但是我找不到适合高山的解决方案
我认为,this可以在Alpine中实现类似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 .

答案 2 :(得分:1)

我们在alpine和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

这为我们解决了问题。

答案 3 :(得分:0)

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

在使用它们之前应该设置,因为docker从上到下构建dockerfile中的图像。

答案 4 :(得分:0)

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

我从以下位置更改了cntlm.conf文件:

Listen 58888

...至:

Listen 0.0.0.0:58888

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