docker - 使用来自主机的 socks5 代理进行 docker build
问题描述
要构建某个图像,我需要创建一个隧道并让 docker 将此隧道用作 socks5 代理(也将代理用于 DNS)。
所以现在我有几个问题:
- 如何让 docker 使用主机上的代理?
- 如何让docker使用代理获取基础镜像?
- 如何让 docker 使用代理来执行 RUN 指令?
- 如何让 docker 使用代理进行 ADD 指令?
解决方案
由于我花了一整天的时间研究这个,这里有答案。
我将在下面留下部分不完整/错误/旧的答案,因为我今天建立了一个新系统并且需要再次弄清楚所有问题,因为旧答案的某些部分不再有意义。
使用
localhost:port
不起作用。在解决此问题之前,您需要使用 docker0 网络接口的 IP 地址(172.17.0.1
在我的情况下)。如果您的主机操作系统是 linux,您可以localhost:port
通过传递附加--network=host
参数来使用,docker build
如其他答案中所述。也适用于 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": ""
}
}
}
- 似乎该
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。
从这里开始的不完整/错误/旧答案
- 使用 localhost:port 不起作用。在解决此问题之前,您需要使用 docker0 网络接口的 IP 地址(在我的情况下为 172.17.0.1)。
- 这个答案也适用于问题 3。只需将这个内容(如果需要更改IP和端口)放入
~/.docker/config.json
(注意协议是socks5h)
{
"proxies":
{
"default":
{
"httpProxy": "socks5h://172.17.0.1:3128",
"httpsProxy": "socks5h://172.17.0.1:3128",
"noProxy": ""
}
}
}
- 我不知道为什么,但是对于 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
推荐阅读
- usb - 未绑定的 USB 设备在 linux 上自动绑定
- azure - 使用 Powershell 发布到 WebApp 虚拟目录
- c# - 无法侦听前缀“http://IPAddress:Port/”,因为它与机器上的现有注册冲突
- php - 在 phpMailer 中动态设置电子邮件地址
- css - 需要删除 React-Bootstrap 列内的两个元素之间的空间
- c# - 当 TransferMode == Automatic 时定义 ASCII 传输的 WinSCP .NET 程序集自定义列表
- python - 检测数据框的所有更改
- windows - 在 opencv 中,有没有办法打开实时记录和创建的 .avi?
- javascript - 用手风琴连接 svg rect
- eclipse - 0000004a SSLHandshakeE E SSLC0008E: 无法初始化 SSL 连接