Docker设置中的Docker compose无法绑定secret

bkhjykvo  于 12个月前  发布在  Docker
关注(0)|答案(1)|浏览(135)

我有一个项目与docker-compose.yml

version: '3'
services:
  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    volumes:
      - ./backend:/app
    secrets:
      - mysecretkey
    ports:
      - "5000:5000"

secrets:
  mysecretkey:
    file: ../data/thesecretjwtkey.txt

字符串
我想使用Jenkins自动化部署。由于我的Jenkins代理没有安装docker-composedocker compose,并且因为我不想只将docker-compose独立二进制文件 curl 到我的Jenkins代理中,所以我决定使用Docker in Docker方法。
我在Jenkins代理中做的事情:
1.我拉了一个包含docker compose插件的docker镜像
1.我在docker容器中克隆了我的项目源代码
1.我在docker容器中运行一个python脚本,创建data/thesecretjwtkey.txtchmod 777 -R data/
1.我更改了容器环境变量中的DOCKET_HOST,以将Docker套接字链接到主机套接字
1.运行docker compose
Docker运行,构建工作,但我一直得到这个错误:

Error response from daemon: invalid mount config for type "bind": bind source path does not exist: MYPATH_IN_DOCKER_CONTAINER/data/thesecretjwtkey.txt


然而,当我去我的Docker容器MYPATH_IN_DOCKER_CONTAINER/data/thesecretjwtkey.txt在这里...

编辑:

我的Jenkinsfile的简化版本

node {
     def image = docker.image('my-custom-image')
     image.inside("--user=root -e DOCKER_HOST=${env.DOCKER_HOST}") {
        stage('clone') { 
           checkout scm
        }
        stage('Deploy') { 
           sh "python3 -u deployscripts/deploy.py"
        }
     }

}


在我的deploy.py中,我有这样的东西

generate_secret(secret_path="data/thesecretjwtkey.txt")
os.system("docker compose -f docker-compose.yml up build")


我的简化项目树的概述:

├── backend
├── data
│   └── thesecretjwtkey.txt
├── deployscripts
│   └── deploy.py
├── docker-compose.yml
└── Jenkinsfile


在我的机器上一切正常...

f5emj3cl

f5emj3cl1#

您有:

[ Jenkins Agent (Host) ]
   │
   └─ [ Docker Container (DinD Environment) ]
         │
         ├─ [ Cloned Project ]
         │    ├─ backend
         │    ├─ data
         │    │   └─ thesecretjwtkey.txt (Not accessible to Docker Daemon)
         │    ├─ deployscripts
         │    │   └─ deploy.py
         │    └─ docker-compose.yml
         │
         └─ [ Docker Compose ]
               └─ [ Backend Service ]
                   └─ Secret Bind: ../data/thesecretjwtkey.txt (Path interpreted by Docker Daemon)

字符串
运行在Jenkins主机上的Docker守护进程正在尝试访问../data/thesecretjwtkey.txt,但此路径在主机的文件系统中解析,而不是在Docker容器中解析。
thesecretjwtkey.txt文件实际上位于Docker容器中,主机上的Docker守护进程无法访问。
您需要更正docker-compose.yml中的文件路径,以反映在Jenkins主机上可访问的位置,而不是Docker容器内。

version: '3'
services:
  backend:
    # existing configuration 
    secrets:
      - mysecretkey
secrets:
  mysecretkey:
    file: /path/accessible/to/docker/daemon/thesecretjwtkey.txt


并配置Jenkins管道,使机密文件在主机上Docker守护进程可访问的路径上可用:确保Jenkins管道将包含来自Jenkins代理的thesecretjwtkey.txt的目录Map到Docker守护进程可以访问的Docker容器路径上。

node {
    def image = docker.image('my-custom-image')
    image.inside("--user=root -e DOCKER_HOST=${env.DOCKER_HOST} -v /path/on/jenkins/agent:/path/accessible/to/docker/daemon") {
        // existing stages 
    }
}

相关问题