【问题标题】:Jenkins Docker Pipeline override working directoryJenkins Docker Pipeline 覆盖工作目录
【发布时间】:2018-08-10 16:37:32
【问题描述】:

我注意到在将 Jenkins 与 Docker Pipeline 插件一起使用时。当我创建 Jenkins 文件以在 docker 容器中运行命令时,它总是创建 Jenkins 工作区目录的卷映射,映射到正在运行的容器中的相同路径。它还会创建一个具有相同路径的工作目录。

docker run -t -d -u 127:134 -w /var/lib/jenkins/workspace/DockerTest 
-v /var/lib/jenkins/workspace/DockerTest:/var/lib/jenkins/workspace/DockerTest:rw,z 
-v /var/lib/jenkins/workspace/DockerTest@tmp:/var/lib/jenkins/workspace/DockerTest@tmp:rw,z 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
jekyll/jekyll:builder cat

我试图通过在我的 Jenkinsfile 中为 Docker 提供参数来覆盖它,如下所示:

pipeline {
  agent {
    docker {
      image 'jekyll/jekyll:builder'
      args '-v $HOME:/srv/jekyll -w /srv/jekyll'
    }
  }
  stages {
    stage('Test') {
      steps {
      sh 'cd /srv/jekyll && ls -l'
      }
    }
  }
}

似乎这只是将选项添加到 Docker 命令之前,并且工作目录和卷映射被默认设置覆盖:

docker run -t -d -u 127:134 
-v $HOME:/srv/jekyll 
-w /srv/jekyll 
-w /var/lib/jenkins/workspace/DockerTest 
-v /var/lib/jenkins/workspace/DockerTest:/var/lib/jenkins/workspace/DockerTest:rw,z 
-v /var/lib/jenkins/workspace/DockerTest@tmp:/var/lib/jenkins/workspace/DockerTest@tmp:rw,z 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
-e ******** 
jekyll/jekyll:builder cat

有什么方法可以覆盖卷映射和工作目录?

【问题讨论】:

标签: docker jenkins jenkins-plugins jenkins-pipeline


【解决方案1】:

你可以结合docker {}和dir {}来控制工作目录:

pipeline {
  agent {
    docker {
      image 'jekyll/jekyll:builder'
      args '-v $HOME:/srv/jekyll'
    }
  }
  stages {
    stage('Test') {
      steps {
        dir(path: '/srv/jekyll') {
          sh 'ls -l'
        }
      }
    }
  }
}

我已经删除了 -w 参数,因为它没有效果,并将 cd /src/jekyll 替换为 dir(path: '/srv/jekyll'){...}

【讨论】:

  • 使用dir(path: '/src') 时,管道失败并出现以下问题。还有什么可以解决的吗? process apparently never started in /src@tmp/durable-234fa142
  • 它说有java.nio.file.AccessDeniedException 任何想法如何解决它?
  • 如果您希望在运行时创建该目录怎么办?目标是让并发构建不会覆盖彼此的文件。
【解决方案2】:

我们有一个相同的要求,即在容器中使用与默认目录不同的工作目录,在检查它之后理解它现在是不可能的。在此处查看更多详细信息JENKINS-41474、JENKINS-35406、JENKINS-33510

另一种方法是使用dir("path_to_work") { sh ' '},但它也不起作用。 所以唯一的方法是使用args 将卷挂载到容器中,并在其中运行所有带有更改目录命令的命令

  pipeline {
  agent {
    docker {
      image 'alpine:3.7'
      args '-v $HOME/src:/src'
    }
  }
  stages {
    stage('Build') {
      steps {
      sh 'cd /src ; ./run_build.sh'
      }
    }
  }
}

【讨论】:

    【解决方案3】:

    @Nagri 不幸的是我仍然无法指定工作目录和卷映射。

    但我可以以 root 身份运行 jekyllll。

    这并不理想,但至少它有效。

    
        pipeline {
            agent {
                docker {
                    image 'jekyll/jekyll:builder'
                    args '-u root'
                }
            }
            stages {
                stage('Test') {
                    steps {
                        sh 'mkdir -p _site'
                        sh 'jekyll build'
                    }
                }
            }
        }
    
    

    【讨论】:

      【解决方案4】:

      我找到的解决方案不是尝试手动设置目录,因为我想并行执行同一管道的多个实例,而是避免节点重用。 https://www.jenkins.io/doc/book/pipeline/docker/#workspace-synchronization

      pipeline {
          agent {
              docker {
                  // parent image: https://hub.docker.com/layers/maven/library/maven/3.6.3-jdk-11/images/sha256-1801d353e27e68d60355b371ddfd2ed8d06204bc3266f1746fdade897bb8b6bd?context=explore
                  image 'fra.ocir.io/XXX/maven:3.6.3-jdk-11'
                  registryUrl 'https://fra.ocir.io/'
                  registryCredentialsId 'YYY'
                  args '-v /var/run/docker.sock:/var/run/docker.sock -v /opt/data/jenkins/.m2/settings.xml:/usr/share/maven/conf/settings.xml'
      
                  // Create a new tmp folder for the current build
                  reuseNode false
              }
          }
          environment {
              JAVA_HOME = '/usr/local/openjdk-11'
          }
          stages {
              stage('Build Test') {
                  steps {
                      // https://www.jenkins.io/doc/pipeline/steps/git/
                      git credentialsId: 'credentials-jenkins-gitlab',
                          url: 'git@####.git',
                          branch: 'develop-devops'
      
                      // https://plugins.jenkins.io/pipeline-maven/
                      withMaven(
                          maven: 'maven-3.6.3',
                          jdk: 'jdk-11'
                      ){
                          sh 'printenv |sort'
      
                          sh 'mvn help:effective-settings'
      
                          sh 'mvn verify'
      
                          sh 'echo "$(date)" >> test-file'
                      }
                  }
              }
          }
          post {
                  success {
                      // Check if the file is dirty with previous writes
                      sh 'cat test-file'
      
                      // Clean the current workspace
                      cleanWs()
                  }
              }
      }
      

      【讨论】:

        【解决方案5】:

        我曾经遇到过类似的问题,问题不在于工作目录,因为我使用 ENV 变量从任何地方访问我的二进制文件。

        我的问题是权限问题,尽管我没有看到任何有关权限的错误消息。只需以 root 用户身份执行命令,看看是否有效,例如:

        pipeline {
          agent {
            docker {
              image 'jekyll/jekyll:builder'
              args '-v $HOME:/srv/jekyll -w /srv/jekyll -u root'
            }
          }
          stages {
            stage('Test') {
              steps {
              sh 'cd /srv/jekyll && ls -l'
              }
            }
          }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-27
          • 1970-01-01
          • 2017-09-17
          • 1970-01-01
          • 1970-01-01
          • 2019-11-03
          • 1970-01-01
          • 2016-10-31
          相关资源
          最近更新 更多