首页 > 解决方案 > 使用来自主机的 socks5 代理进行 docker build

问题描述

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

所以现在我有几个问题:

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

标签: dockerproxydnssockstunnel

解决方案


由于我花了一整天的时间研究这个,这里有答案。

我将在下面留下部分不完整/错误/旧的答案,因为我今天建立了一个新系统并且需要再次弄清楚所有问题,因为旧答案的某些部分不再有意义。

  1. 使用localhost:port不起作用。在解决问题之前,您需要使用 docker0 网络接口的 IP 地址(172.17.0.1在我的情况下)。如果您的主机操作系统是 linux,您可以localhost:port通过传递附加--network=host参数来使用,docker build如其他答案中所述。

  2. 也适用于 3.。只需将这个内容(如果需要更改IP和端口)放入~/.docker/config.json(注意协议是socks5h)

    {
        "proxies":
        {
            "default":
            {
                "httpProxy": "socks5h://172.17.0.1:3128",
                // or "httpProxy": "socks5h://localhost:3128", with --network=host
                "httpsProxy": "socks5h://172.17.0.1:3128",
                "noProxy": ""
            }
        }
    }
  1. 似乎该ADD命令是使用主机的(代理)环境变量执行的,而忽略config.json. 更复杂的是,由于守护程序通常与root用户一起运行,因此只root获取用户的环境变量。更复杂的是,主机当然需要使用 localhost 作为代理主机。最重要的是:无论出于何种原因,在这种情况下,协议都需要socks5(最后缺少)。h

就我而言,由于我切换到 WSL2 并在 WSL2 中使用 docker(dockerd手动启动 docker 守护程序),因此我只需在调用之前导出所需的环境变量dockerd

#!/bin/bash
DOCKER_DIR=~/sys/docker
DOCKER_SOCK="$DOCKER_DIR/docker.sock"

# unset any proxy env vars that the regular user might have set
# because we pass the environment variables with sudo -E
unset http_proxy
unset https_proxy
unset no_proxy
unset HTTP_PROXY
unset HTTPS_PROXY
unset NO_PROXY
# only this env var is needed for ADD in Dockerfile
export http_proxy=socks5://localhost:3128

export DOCKER_HOST="unix://$DOCKER_SOCK"
if [ ! -S "$DOCKER_SOCK" ]; then
    mkdir -pm o=,ug=rwx "$DOCKER_DIR"
    chgrp docker "$DOCKER_DIR"
    sh -c "nohup sudo -E -b dockerd < /dev/null > $DOCKER_DIR/dockerd.log 2>&1"
fi

如果您在 linux 机器上进行了“常规”设置,则可以使用 4. 的旧答案,但请注意您可能还需要使用 localhost。

从这里开始的不完整/错误/旧答案

  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": ""
            }
        }
    }
  1. 我不知道为什么,但是对于 ADD 指令,以前的设置不适用(名称不会通过代理解析)。我们需要把这个内容放入/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=socks5://172.17.0.1:3128/"

然后

sudo systemctl daemon-reload
sudo systemctl restart docker

(这只是错误/不需要答案 2。)此外,对于希望yum能够在构建期间更新包的包管理器,您需要像这样传递环境变量:

docker build --build-arg http_proxy=socks5://172.17.0.1:3128

推荐阅读