使用来自主机的 socks5 代理进行 docker 构建

JSa*_*mir 6 dns proxy tunnel socks docker

要构建某个图像,我需要创建一个隧道并使 docker 使用此隧道作为 socks5 代理(也将代理用于 DNS)。

所以现在我有几个问题:

  1. 如何让docker使用主机上的代理?
  2. 如何让docker使用代理获取基础镜像?
  3. 如何让 docker 使用代理来执行 RUN 指令?
  4. 如何让docker使用代理进行ADD指令?

JSa*_*mir 11

由于我花了一整天的时间研究这个,以下是答案:

  1. 使用 localhost:port 不起作用。在解决问题之前,您需要使用 docker0 网络接口的 IP 地址(在我的情况下为 172.17.0.1)。
  2. 这个答案也适用于问题 3。把这个内容(如果需要改变IP和端口)放入~/.docker/config.json(注意协议是socks5h)
    {
        "proxies":
        {
            "default":
            {
                "httpProxy": "socks5h://172.17.0.1:3128",
                "httpsProxy": "socks5h://172.17.0.1:3128",
                "noProxy": ""
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)
  1. 我不知道为什么,但是对于 ADD 指令,以前的设置不适用(名称不能通过代理解析)。我们需要把这个内容放入/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=socks5://172.17.0.1:3128/"
Run Code Online (Sandbox Code Playgroud)

然后

sudo systemctl daemon-reload
sudo systemctl restart docker
Run Code Online (Sandbox Code Playgroud)

此外,对于希望yum能够在构建期间更新包的包管理器,您需要像这样传递环境变量:

docker build --build-arg http_proxy=socks5://172.17.0.1:3128
Run Code Online (Sandbox Code Playgroud)