由于我一整天都在研究这个问题,以下是答案。
我将保留部分不完整/错误/旧的答案,因为我今天设置了一个新系统,需要重新解决所有问题,因为旧答案的某些部分不再合理。
使用 localhost:port
是无效的,直到此问题得到解决,您需要使用 docker0 网络接口的 IP 地址(在我的情况下是 172.17.0.1
)。如果您的主机操作系统是 linux,则可以通过向 docker build
传递额外的 --network=host
参数来使用 localhost:port
,如其他答案中所述。
只需将此内容(必要时更改 IP 和端口)放入 ~/.docker/config.json
中(请注意协议是 socks5h)
{
"proxies":
{
"default":
{
"httpProxy": "socks5h://172.17.0.1:3128",
"httpsProxy": "socks5h://172.17.0.1:3128",
"noProxy": ""
}
}
}
- 看起来
ADD
命令是使用主机的 (代理) 环境变量执行的,忽略了 config.json
中的环境变量。更加复杂的是,由于守护程序通常以 root
用户运行,因此只会获取 root
用户的环境变量。更加复杂的是,主机当然需要将 localhost 用作代理的主机名。还有最后一点:在这种情况下,协议需要使用 socks5
(缺少末尾的 h
), 不管出于什么原因。
在我的情况下,由于我切换到了 WSL2 并在 WSL2 中使用 docker (手动启动 dockerd
Docker 守护进程),我只需要在调用 dockerd
之前导出所需的环境变量即可:
#!/bin/bash
RUNNING=`ps aux | grep dockerd | grep -v grep`
if [ -z "$RUNNING" ]; then
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY no_proxy NO_PROXY
export http_proxy=socks5h://localhost:30000
sudo -E dockerd > /dev/null 2>&1 &
disown
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": ""
}
}
}
- 我不知道为什么(编辑:现在我知道了,是因为
dockerd
作为root用户运行,并且它没有从普通用户中获取代理环境变量),但对于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
.docker/
或者更好的.config/docker/
文件夹中创建此文件仍然更容易。 - JSamir