Jenkins Docker Pipeline 覆盖工作目录

20

我注意到在使用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

我是否有办法以任何方式覆盖音量映射和工作目录?


请发布运行的输出。 - Janpan
1
@julianlab,你找到解决方案了吗?我也遇到了同样的问题。 - Nagri
@Nagri 请参见以下链接 https://dev59.com/nFUM5IYBdhLWcg3wSOmn#69469421 - tuxErrante
5个回答

3
您可以将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参数,因为它没有效果,并用dir(path: '/srv/jekyll'){...}代替了cd /src/jekyll


2
当使用dir(path: '/src')时,pipeline 发生以下错误。是否有其他方法可以修复这个问题?process apparently never started in /src@tmp/durable-234fa142 - Reddysekhar Gaduputi
2
它说有java.nio.file.AccessDeniedException,有什么想法如何修复它? - Krzysztof Krzeszewski
如果您希望在运行时创建该目录怎么办?目标是让并发构建不覆盖彼此的文件。 - tuxErrante

2
我们有一个要求,需要使用与容器默认工作目录不同的工作目录,经过检查我们发现目前还不可能实现。更多细节请参考JENKINS-41474JENKINS-35406JENKINS-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'
      }
    }
  }
}

1

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

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

这并不理想,但至少能够工作。


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


0
我找到的解决方案是不要尝试手动设置目录,因为我想并行执行同一管道的多个实例,而是避免节点重新利用。 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()
            }
        }
}

-1

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

我的问题是权限问题,尽管我没有看到任何关于权限的错误消息。只需以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'
      }
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接