【问题标题】:Docker on a linux VMware machine: error with apt-get and proxylinux VMware 机器上的 Docker:apt-get 和代理出错
【发布时间】:2018-02-26 19:17:31
【问题描述】:

我有一台装有 linux mint 18.3 的 VMware 机器(主机是 windows 10)。主机位于代理后面。来宾机器(linux mint)网络配置为“桥接”?

我尝试在来宾操作系统上编写一个简单的 Dockerfile 并构建它,但 apt-get 命令存在问题:

FROM ubuntu:xenial 

RUN apt-get update && apt-get install -y \
  bzip2 \
  g++ \
  make \
  ncurses-dev \
  wget \
  zlib1g-dev

它给了我:

Err:1 http://security.ubuntu.com/ubuntu xenial-security InRelease 解决“security.ubuntu.com”的临时故障

我尝试在 Dockerfile 中添加:

ENV http_proxy 'http://proxy_adress:3128'
ENV https_proxy 'http://proxy_adress:3128'

得到了这个错误:

Err:1 http://security.ubuntu.com/ubuntu xenial-security InRelease 解决“proxy_adress”暂时失败

我是否必须更改 VMware 配置中的某些内容?还是在 Dockerfile 中?

谢谢

【问题讨论】:

  • 包链接有效吗?可能会在一段时间后尝试,因为错误显示Temporary failure
  • 自上周以来我在不同的日子尝试过,但总是出现同样的错误。
  • 我想我有一个启动解决方案:我通过添加 --net=host 选项尝试了 docker run 命令,它成功了!现在我想构建我的 docker 但 docker build 没有 --net 参数...有什么办法可以规避这个吗?
  • 您是否也在 Windows 10 机器上安装了 Docker?
  • @sxm1972 我尝试了相同的命令 (docker run ubuntu:xenial apt-get update) 并且它有效。所以最后我可以使用 windows 10 docker 机器来构建我的 docker,但是在主机和来宾操作系统之间切换不是很方便......

标签: docker proxy vmware apt


【解决方案1】:

我假设您可能在公司网络中,您需要进行两项更改。

$ cat /etc/resolv.conf

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 10.X.Y.Z
search myorg.org

您需要在您的 docker daemon 配置中设置这些。您可以通过创建具有以下内容的文件/etc/docker/daemon.json 来做到这一点

{
  "dns": ["10.X.Y.Z"],
  "dns-search": ["myorg.org"]
}

实际值将取决于您获得的输出。

您还需要更改代理设置并将其应用到您的 docker 服务插件文件中。这可以按照以下线程中列出的方式完成

lookup registry-1.docker.io: no such host(与 VonC 已经指出的相同)

Nodemailer with Docker

【讨论】:

  • 感谢 daemon.json + http-proxy.conf 的修改完成!
  • 但是现在我遇到了拉新码头工人的问题。示例:docker pull alpine 给我:Error response from daemon: Get https://registry-1.docker.io/v2/: Proxy Authentication Required。从 /etc/systemd/system/docker.service.d/http-proxy.conf 文件中删除信息可以解决错误,但会从主要问题中重新引入代理问题。我应该打开一个新问题吗?
  • 你能试试像http://user:password@proxy:port这样的代理吗?如果这不起作用,您应该打开一个新问题,因为它与原始问题不同
【解决方案2】:

在构建时不需要将ENV 添加到您的 Dockerfile:在 docker 构建期间,唯一需要代理的是 docker 守护进程。

参见“Control Docker with systemd”,尤其是“HTTP/HTTPS proxy”部分

/etc/systemd/system/docker.service.d/http-proxy.conf

Environment="HTTP_PROXY=http://proxy.example.com:80/" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporatio

接着是:

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

Verify that the configuration has been loaded:

$ systemctl show --property=Environment docker
Environment=HTTP_PROXY=http://proxy.example.com:80/

【讨论】:

  • 感谢您的回答。我试过了,但没有任何改变:(使用docker run --net=host它有效..)
  • @NicolasRosewick 在您使用 --net=host 时是否可以使用 http-proxy.conf?
  • @NicolasRosewick 我并不惊讶它与 --net=host 一起工作。但是对于桥接,尝试添加一个 NO_PROXY=proxy_adress 以确保它不会尝试使用代理来解析代理!
  • 好的,我试过了:[Service] Environment="HTTP_PROXY=http://proxy_adress:3128/" "NO_PROXY=http://proxy_adress:3128",但没有成功。如果我错过了你的回答,我很抱歉。
  • @NicolasRosewick NO_PROXY=proxy_adress(无 https 或端口)
【解决方案3】:

这将与 dns 服务器有关。

尝试将默认的 dns 服务器 sed 到另一台,例如 114.114.114.114:

sed -i 's/\(nameserver\) .*/\1 114.114.114.114/' /etc/resolv.conf

【讨论】:

    【解决方案4】:

    您的容器似乎无法解析代理的主机名。因此,当您构建容器时,请传递以下附加参数:

    --dns=IP_ADDRESS...
    

    这将执行此操作:

    将作为名称服务器行添加的 IP 地址设置到容器的 /etc/resolv.conf 文件中。容器中的进程在遇到不在 /etc/hosts 中的主机名时,将连接到端口 53 上的这些 IP 地址以寻找名称解析服务。

    来源:https://docs.docker.com/v17.09/engine/userguide/networking/default_network/configure-dns/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多