You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:02:12