本文最后更新于 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:// 前缀!!!