微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

DevOps Containerized jenkins:在构建阶段无法访问 jenkins 管道内的 docker volume /var/lib/docker/volumes

如何解决DevOps Containerized jenkins:在构建阶段无法访问 jenkins 管道内的 docker volume /var/lib/docker/volumes

我正在使用 jenkins 容器,我使用 docker-compose 运行这个容器

这是我的 docker-compose 文件

version: '3.3'
 services:
  jenkins-service:

    build: 
      context: ./
    image: docker/jenkins-local
    ports: 
     - 8080:8080
     - 5000:5000
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - jenkins_data_prod:/var/jenkins_home
      - jenkins_tmp_data_prod:/tmp
volumes:
  jenkins_data_prod:
  jenkins_tmp_data_prod:
 

这是我的 dockerfile

FROM jenkins/jenkins:lts

# Installation of docker
USER root
RUN curl -sSL https://get.docker.com/ | sh

# Adding user jenkins in groupe "docker"
RUN usermod -aG docker jenkins

# Installation of docker-compose
RUN curl -L https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
RUN chmod +x /usr/local/bin/docker-compose


#USER jenkins

之后我使用 docker-compose up --build 命令运行 jenkins

我首先注意到我的 docker 正在安装卷 "jenkins_jenkins_data_prod""jenkins_jenkins_tmp_data_prod" 作为名称,而我只写了 "jenkins_data_prod" strong> 和 "jenkins_tmp_data_prod" 在我的 docker-compose.yml 上,所以我修改了我的文件并将卷名称写为 "data_prod""tmp_data_prod"

像这样:

volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - data_prod:/var/jenkins_home
      - tmp_data_prod:/tmp
volumes:
  data_prod:
  tmp_data_prod:

我发现卷安装在“/var/lib/docker/volumes/jenkins_data_prod/_data” 当我使用此命令检查挂载点时,作为“jenkins_data_prod”和“jenkins_tmp_data_prod”:

'docker volume inspect jenkins_data_prod' 

结果命令:

terminal :
 {
        "CreatedAt": "2021-06-15T23:33:41Z","Driver": "local","Labels": {
            "com.docker.compose.project": "jenkins","com.docker.compose.version": "1.29.1","com.docker.compose.volume": "data_prod"
        },"Mountpoint": "/var/lib/docker/volumes/jenkins_data_prod/_data","Name": "jenkins_data_prod","Options": null,"Scope": "local"
    }


所以在那之后我运行一个 Jenkins pipline 在 gitlab 上构建一个个人项目,它使用“/var/jenkins_home”作为工作区

我有一个使用绑定安装卷的 docker-compose.yml 文件

我的 docker-compose 运行

version: '3.3'
services:
 netcore:
   image: mcr.microsoft.com/dotnet/sdk:3.1
   volumes:
     - ../../projet-api/:/sources
     - ${NUGET_HOME}/.nuget/:/root/.nuget
     - ../build/netcore/application:/application
   working_dir: /sources
   command: dotnet publish -o /application -c Debug --self-contained false /p:Version=${VERSION}

当我在“/var/jenkins_home”工作区上运行图像时,我曾经有错误

+ docker-compose run --rm netcore
Microsoft (R) Build Engine version 16.7.2+b60ddb6f4 for .NET
copyright (C) Microsoft Corporation. All rights reserved.

MSBUILD : error MSB1003: Specify a project or solution file. The current working directory does not contain a project or solution file.

所以“/var/jenkins_home”是空的,我的docker-compose只创建了名称为“/projet-api”和“/build/netcore/application”的文件夹,我过去常常看到包含项目的工作区在哪里我在“\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\jenkins_data_prod_data\workspace”中找到它

我查看了 arround docs,发现“\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes”被映射到“/var/lib/docker/volumes/”

所以我决定尝试使用环境变量运行图像

version: '3.3'
services:
  netcore:
    image: mcr.microsoft.com/dotnet/sdk:3.1
    volumes:
      - ${PWD_docker}/../../projet-api/:/sources
      - ${NUGET_HOME}/.nuget/:/root/.nuget
      - ${PWD_docker}/../build/netcore/application:/application
    working_dir: /sources
    command: dotnet publish -o /application -c Debug --self-contained false /p:Version=${VERSION}

我在 jenkinsfile 中运行的部分

node {
    
    //*********************************
    // getting code
    //*********************************
    stage ('SCM'){
        checkout scm
    }
    //*********************************
    // docker images
    //*********************************
     
     stage('RUNNING NETCORE') {
       
        dir ('project-docker/compile'){
            def containerPWD = pwd() // printing /var/jenkins_home/....
            def pwdval = "/var/lib/docker/volumes/jenkins_data_prod/_data"
            def dockerHostPWD = containerPWD.replace("/var/jenkins_home",pwdval)//  /var/lib/docker/volumes/jenkins_data_prod/_data
            
            def props = readProperties file: '.env'
            VERSION = props.VERSION 
            withEnv(["NUGET_HOME=${dockerHostPWD}","VERSION=${VERSION}","PWD_docker=${dockerHostPWD}"]) {  
               
                sh """   
                    docker-compose run --rm netcore                      
                """
            }
       }
    }
                                 .
        // rest of the code      .
                                 .

仍然是 MSBUILD : error MSB1003: Specify a project or solution file. The current working directory does not contain a project or solution file.错误

问题

1/ 使用这些路径运行我的 docker-compose 只创建文件夹,在最后一个我把它放在“\wsl$\Ubuntu\var\lib\docker\volumes”中,所以看起来就像 jenkins 不能访问“\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes”这是包含项目的工作区,使用路径“/var/lib/docker/volumes”任何人都可以帮我找出如何访问卷? 也许 "/var/lib/docker/volumes" 并没有真正映射到 "\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes" ?但是对于“\wsl$\Ubuntu\var\lib\docker\volumes”?

(无需建立符号链接,或将我的主机“/var/jenkins_home”绑定到运行 jenkins 的 docker-compose 中的 jenkins“/var/jenkins_home”。)

2/ 我的第二个问题是为什么我的卷前有“jenkins_”前缀,我们可以在标签“com.docker.compose.volume”上看到:“data_prod”,然后我们看到在名称名称”处:“jenkins_data_prod” 以及为什么标签卷是“data_prod”而卷名不是

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。