域名形式的代理用户名可能包含反斜杠,密码也可能包含 URI 语法保留的字符。构建代理 URL 时,要编码这些凭据组成部分:例如反斜杠会变成 %5C。

systemd 服务中的 Environment 赋值又引入一个解析器。单元配置里的字面百分号需要写成两个:

[Service]
Environment="HTTPS_PROXY=http://DOMAIN%%5Cproxy-user:example%%[email protected]:8080"

示例值代表一个域名用户名和包含 # 的密码。systemd 会把 %% 变成 %,把编码后的 URL 留给守护进程。如果该目标协议也需要这条路径,就再加上对应的 HTTP_PROXY 赋值。

双百分号是 systemd 的语法。而 Docker 的 daemon.json 中的代理值包含的是普通 URI 转义,例如 %5C 和 %23。不要把单元文件里的写法原样复制到 JSON 或客户端的代理 URL 字段中。

也要留意已配置的来源。Docker 的文档说明,守护进程的代理配置优先于代理环境变量;因此较旧的 JSON 值可能掩盖已经修正的服务环境。

相关文章