Jenkins Docker管道覆盖工作目录
我注意到当使用Jenkins和Docker管道插件时。当我创建Jenkins文件以在docker容器中运行命令时,它总是创建Jenkins工作区目录的卷映射,映射到运行容器中的相同路径。它还创建具有相同路径的工作目录Jenkins Docker管道覆盖工作目录,docker,jenkins,jenkins-plugins,jenkins-pipeline,Docker,Jenkins,Jenkins Plugins,Jenkins Pipeline,我注意到当使用Jenkins和Docker管道插件时。当我创建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/Doc
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命令的选项前面加上了前缀,默认设置会覆盖workdir和volume映射:
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
是否有任何方法可以以任何方式覆盖卷映射和工作目录?我曾经遇到过类似的问题,问题不在于工作目录,因为我使用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'
}
}
}
}
@很遗憾,我仍然无法指定工作目录和卷映射 但我可以让杰基尔当根 这并不理想,但至少是可行的
pipeline {
agent {
docker {
image 'jekyll/jekyll:builder'
args '-u root'
}
}
stages {
stage('Test') {
steps {
sh 'mkdir -p _site'
sh 'jekyll build'
}
}
}
}
您可以将
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(路径:'/srv/jekyll'){…}
在检查后,我们有一个相同的要求,即使用不同于容器中默认目录的工作目录,这是不可能的。查看此处了解更多详细信息
另一种方法是使用dir(“path_to_work”){sh'}
,但它也不起作用。
所以,唯一的方法是将卷装入带有args
的容器中,并使用其中的change directory命令运行所有命令
pipeline {
agent {
docker {
image 'alpine:3.7'
args '-v $HOME/src:/src'
}
}
stages {
stage('Build') {
steps {
sh 'cd /src ; ./run_build.sh'
}
}
}
}
请发布运行结果。@julianlab您找到解决方案了吗?我面临同样的问题。当使用
dir(路径:'/src')
时,管道失败,如下所示。还有什么办法可以解决这个问题吗<代码>进程显然从未在中启动/src@tmp/耐用-234fa142它说有java.nio.file.AccessDeniedException
如何修复它?