在docker-compose与Python应用中使用Docker Secrets时遇路径不存在错误
Docker Swarm中使用Secret时/run/secrets目录不存在的问题
我尝试用Docker Secret存储用户名和密码,操作步骤如下:
- 初始化Docker Swarm
docker swarm init
- 创建Docker Secrets
echo "username" | docker secret create app_username - echo "password" | docker secret create app_password -
- 更新docker-compose.yml文件,内容如下:
version: "3.8" secrets: app_username: external: true app_password: external: true services: backend: container_name: lxd-backend build: context: ./backend dockerfile: backend.dockerfile image: lce-backend:latest env_file: - .env ports: - 8085:80 secrets: - app_username - app_password environment: - SERVER_NAME=localhost - SERVER_HOST=https://localhost - APP_USER_FILE=/run/secrets/app_username - APP_PW_FILE=/run/secrets/app_password
之后在Python脚本中执行以下代码:
print("file: ", os.listdir('/run/secrets/'),flush=True)
但出现错误:cannot access /run/secrets: no such file or directory,请问哪里操作有误?
问题原因及解决办法
核心问题在于你用了普通的docker-compose up命令部署服务,而非Swarm模式的部署命令。Docker Compose的单机模式不会处理Swarm Secrets,只有通过Swarm栈部署的服务才会自动将Secrets挂载到/run/secrets/目录下。
正确部署步骤:
- 先确认Swarm集群状态正常,执行
docker node ls查看节点状态为Ready - 替换部署命令为Swarm栈部署:
docker stack deploy -c docker-compose.yml <自定义栈名称>
额外注意事项:
- 删除
container_name: lxd-backend配置:Swarm模式不支持自定义容器名称,强行指定会导致部署报错 - 确认Secrets存在:执行
docker secret ls检查app_username和app_password在列表中 - 确保Docker版本兼容:Docker 19.03+完全支持Compose 3.8格式,版本过低建议升级
按上述步骤部署后,容器内的/run/secrets/目录会正常生成,Python脚本也能读取到对应的Secret文件。
内容的提问来源于stack exchange,提问作者Kuni
相关产品推荐
相关产品推荐

