为何Docker Swarm容器仅在-it模式下可访问环境变量与Secrets?
Docker Swarm容器exec命令无法访问环境变量/Secrets的原因及解决方法
核心原因
问题根本不是Docker Swarm的配置问题,而是本地shell的解析优先级导致的干扰:
- 当你用双引号包裹
bash -c的命令内容时,你的本地shell(比如示例里的zsh)会先一步解析所有带$的内容:- 第一个命令中的
$(< /run/secrets/influx_admin_token)会被本地shell执行,而本地机器不存在这个Swarm Secrets挂载的文件,所以直接抛出“no such file or directory”错误; - 第二个命令中的
$INFLUXDB_ADMIN_USER_TOKEN_FILE会被本地shell读取环境变量,由于本地没有这个变量,所以输出空字符串。
- 第一个命令中的
- 而使用
-it模式进入容器时,你是直接在容器内部的bash环境中执行命令,所有$符号和命令解析都在容器内完成,自然能正常访问容器的环境变量和Secrets文件。
解决方法
有两种方式可以避免本地shell的解析干扰:
- 用单引号包裹命令内容:单引号会阻止本地shell解析内部的
$符号,让命令原封不动传递给容器内的bash:docker exec 0e40cc4ae32f /bin/bash -c 'echo "$(< /run/secrets/influx_admin_token)"' docker exec 0e40cc4ae32f /bin/bash -c 'echo "$INFLUXDB_ADMIN_USER_TOKEN_FILE"' - 转义所有
$符号:在每个$前加反斜杠,让本地shell忽略它的解析:docker exec 0e40cc4ae32f /bin/bash -c "echo \$(< /run/secrets/influx_admin_token)" docker exec 0e40cc4ae32f /bin/bash -c "echo \$INFLUXDB_ADMIN_USER_TOKEN_FILE"
内容的提问来源于stack exchange,提问作者jonathan-dev
相关产品推荐
相关产品推荐

