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

Docker in Docker环境下Docker Compose绑定Secret失败问题

问题分析与解决方案

错误根源

核心问题在于:当你在容器内通过DOCKER_HOST调用宿主机的Docker daemon时,docker-compose.yml中secret的file路径是相对于宿主机的文件系统,而非容器内的文件系统。

容器内生成的data/thesecretjwtkey.txt仅存在于容器内部,宿主机的Docker daemon无法访问该路径,因此报错“bind source path does not exist”。本地运行正常是因为脚本与Docker daemon处于同一环境(本地机器),路径上下文完全一致。


解决方案

方案1:共享宿主机与容器的工作目录

让Jenkins容器挂载宿主机的工作目录,确保宿主机与容器共享项目文件,使Docker daemon能直接找到secret文件。

修改Jenkinsfile,添加目录挂载与工作目录指定:

node {
    def workspace = pwd() // 获取宿主机上的Jenkins工作目录
    def image = docker.image('my-custom-image')
    // 挂载宿主机工作目录到容器内相同路径,并设置工作目录
    image.inside("--user=root -e DOCKER_HOST=${env.DOCKER_HOST} -v ${workspace}:${workspace} -w ${workspace}") {
        stage('clone') { 
           checkout scm
        }
        stage('Deploy') { 
           sh "python3 -u deployscripts/deploy.py"
        }
     }
}

此时容器内项目路径与宿主机完全一致,Docker daemon解析../data/thesecretjwtkey.txt时,会基于宿主机工作目录找到对应文件,和本地运行的路径上下文完全匹配。

方案2:使用Docker外部Secret

先在宿主机上创建Docker Secret,再让docker-compose.yml引用这个已存在的Secret,彻底避免文件路径依赖。

  1. 修改docker-compose.yml的secrets配置,标记为外部Secret:
version: '3'
services:
  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    volumes:
      - ./backend:/app
    secrets:
      - mysecretkey
    ports:
      - "5000:5000"

secrets:
  mysecretkey:
    external: true # 声明使用外部已创建的Secret
  1. 修改deploy.py,先创建Secret再启动服务:
generate_secret(secret_path="data/thesecretjwtkey.txt")
# 从容器内的文件创建宿主机的Docker Secret
os.system("docker secret create mysecretkey data/thesecretjwtkey.txt")
# 启动服务
os.system("docker compose -f docker-compose.yml up -d")

注意:此方案需要宿主机启用Docker Swarm模式(执行docker swarm init),因为Docker Secret是Swarm的特性。


内容的提问来源于stack exchange,提问作者RudeusGreyrat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 13:20:16