Docker挂代理安装密钥失败
本文最后更新于 2024-08-25,文章内容距离上一次更新已经过去了很久啦,可能已经过时了,请谨慎参考喵。
前情提要
在按照 Docker 官方给的步骤安装过程中,虽然挂了代理,但是仍然安装失败,或者无法获取远程密钥
系统环境:Debian 12.6
Docker 版本:20.10.24
复现
在 Debian 系统挂着 v2ray 的代理的情况下,执行下面命令:
使用临时变量代理:
export ALL_PROXY=socks://x.x.x.x:xxxx
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
报错无法连接,使用 curl google.com
命令测试可以正常访问
解决办法
加上参数 -E
:
sudo -E curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
原因:
当使用 sudo
命令时,出于安全考虑,默认情况下,它不会保留大部分用户的环境变量,包括那些用于配置代理的环境变量(如 http_proxy
, https_proxy
)。这意味着,即使在用户级别配置了代理,使用 sudo
执行命令时,这些设置不会被自动采用。
sudo
的这种设计主要是为了防止环境变量的潜在安全风险。例如,某些环境变量可能会影响程序的运行行为或权限,从而被恶意利用。为了减少这种风险,sudo
只保留少数必要的环境变量,并清除或重置其他变量。使用 -E
选项: sudo -E
命令会尝试保留所有环境变量。这可以让你在使用 sudo
时保留代理配置。
另一种解决方式是直接设置守护进程的代理,让所有命令(包括 apt
)都走代理:
需要注意的是,这种代理方式虽然是守护进程,但是并不是所有命令都会走,比如
docker pull
,docker 的代理是另一个守护进程,需要单独设置,可以看我另一篇文章。
sudo vim /etc/apt/apt.conf.d/proxy.conf
增加下列行:(如果没有该文件,则创建)
Acquire {
http::Proxy "http://proxy-IP-address:proxyport/";
https::Proxy "http://proxy-IP-address:proxyport/";
}
如果代理服务器是域名,请务必也要加上 http://
前缀!!!