Jenkins Docker管道覆盖工作目录

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

我注意到当使用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/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
如何修复它?