非Swarm模式下Docker Compose Secrets值读取问题求助
非Swarm模式下docker-compose Secrets读取问题解决
问题背景
在非Swarm模式下使用docker-compose Secrets时,尝试多种配置均无法在容器内正确读取密钥值,具体尝试过程如下:
方法一
docker-compose.yml配置:
version: "3.8" services: server: image: alpine:latest secrets: - sec-str environment: - TE_STR=${sec-str} command: tail -F . secrets: sec-str: file: ./secret.s
secret.s内容:
sec-str="A!Bit@complicated-String^%"
执行结果:
/ # echo $TE_STR str
方法二
仅修改secret.s内容为:
"A!Bit@complicated-String^%"
执行结果:
/ # echo $TE_STR str
方法三
将TE_STR=${sec-str}替换为TE_STR=$sec-str,执行结果:
/ # echo $TE_STR -str
问题原因
非Swarm模式下,docker-compose的Secrets不会自动注入环境变量,而是以文件形式挂载到容器内的/run/secrets/[secret-name]路径下。你之前的环境变量写法是Swarm模式的专属用法,在非Swarm环境下不生效,且shell会错误解析变量:
${sec-str}是shell参数展开语法:若sec变量不存在,则用str作为默认值,所以输出str$sec-str会被解析为空变量$sec加上字符串-str,所以输出-str
解决方法
方式1:直接读取secret文件
在容器内直接读取挂载的secret文件内容:
cat /run/secrets/sec-str
方式2:将secret内容导入环境变量
如果需要把secret值放到环境变量中,需要在容器启动时手动读取文件内容赋值,修改docker-compose.yml的command:
version: "3.8" services: server: image: alpine:latest secrets: - sec-str command: > sh -c 'TE_STR=$(cat /run/secrets/sec-str) && echo $TE_STR && tail -F .' secrets: sec-str: file: ./secret.s
同时修改secret.s内容为纯密钥值(不要加引号或变量名):
A!Bit@complicated-String^%
启动容器后,即可通过echo $TE_STR正确获取密钥值。
内容的提问来源于stack exchange,提问作者AbreQueVoy
相关产品推荐
相关产品推荐

