我注意到使用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
我尝试通过在我的Jenkins文件中为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 mapping被默认设置覆盖:
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
有什么办法可以以任何方式覆盖卷映射和工作目录吗?
遗憾的是,@ Nagri仍然无法指定工作目录和卷映射。
但我可以以root身份运行jekyll。
这不是理想的,但至少它是有效的。
```
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(path: '/srv/jekyll'){...}
我有一个类似的问题,问题不是工作目录,因为我使用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'
}
}
}
}