Docker for Mac使用远程context时docker build代理配置问题
~/.docker/config.json 中配置的 proxies 规则,对 docker run 场景会自动把代理注入到启动的容器环境中,但对 docker build 场景,该配置仅对本地Docker引擎的构建生效,不会通过SSH类型的docker context同步到远程Docker引擎的dockerd进程。
你之前在Linux服务器上修改 /etc/sysconfig/docker 配置的代理,仅对服务器本地直接调用dockerd的构建场景生效;当你从Mac通过SSH上下文发起build请求时,远程dockerd读不到你本地Mac上config.json里为remote上下文配的代理参数,自然构建过程中的公网请求会全部失败。
二选一即可,优先选方案1,一次配置所有客户端连接都生效。
方案1:配置远程Docker引擎全局服务代理(推荐)
直接登录部署Docker的Linux服务器,给Docker服务配置systemd级别的全局代理,所有调用dockerd的请求(不管是本地执行还是远程SSH上下文执行)的build过程都会自动继承这个代理配置,是兼容性最好的方案:
- 创建Docker服务的drop-in配置目录:
sudo mkdir -p /etc/systemd/system/docker.service.d
- 写入代理配置文件:
sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF [Service] Environment="HTTP_PROXY=替换为你的企业代理地址" Environment="HTTPS_PROXY=替换为你的企业代理地址" Environment="NO_PROXY=localhost,127.0.0.1,内网网段,私有镜像仓库地址" EOF
- 重载配置重启Docker生效:
sudo systemctl daemon-reload sudo systemctl restart docker
说明:你之前修改的
/etc/sysconfig/docker是CentOS/RHEL旧版本的兼容配置,systemd drop-in配置是所有使用systemd管理Docker的发行版通用的方案,优先级更高,不存在版本兼容问题。
方案2:配置本地Docker客户端全局默认build参数
如果你没有权限修改远程Docker服务器的配置,也不用写shell函数包装docker命令,Docker原生支持在客户端配置文件中设置全局默认build参数,所有build操作(包括远程上下文、docker compose build场景)都会自动携带这些参数:
编辑本地Mac的 ~/.docker/config.json,补充 defaultBuildArgs 配置即可:
{ "proxies": { "remote": { "httpProxy": "...", "httpsProxy": "...", "noProxy": "..." } }, "defaultBuildArgs": { "http_proxy": "替换为你的企业代理地址", "https_proxy": "替换为你的企业代理地址", "no_proxy": "localhost,127.0.0.1,内网网段,私有镜像仓库地址" } }
注意:这里的build参数键名必须全小写(
http_proxy而非HTTP_PROXY),Docker BuildKit识别的默认代理构建参数为小写形式,大小写写错会导致配置不生效。
你当前用的shell包装函数属于临时规避方案,碰到IDE Docker插件、docker compose build等不经过你shell函数的Docker调用场景就会失效,上面两种原生方案没有这个问题。
内容的提问来源于stack exchange,提问作者udondan

