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,彻底避免文件路径依赖。
- 修改
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
- 修改
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
相关产品推荐
相关产品推荐

