【问题标题】:Unable to change a directory inside a Docker container through a Jenkins declarative pipeline无法通过 Jenkins 声明性管道更改 Docker 容器内的目录
【发布时间】:2026-02-11 16:05:02
【问题描述】:

我正在尝试使用此处概述的dir 命令更改当前目录:https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-dir-code-change-current-directory

我已将我的管道编辑为类似于以下内容:

pipeline {
    agent { dockerfile true } 
    stages { 
        stage('Change working directory...') { 
            steps {
                dir('/var/www/html/community-edition') {
                    sh 'pwd'
                }
            }
        }
    }
}

它根本不会更改目录,而是尝试在主机上创建目录并失败并显示java.io.IOException: Failed to mkdirs: /var/www/html/community-edition

使用sh cd /var/www/html/community-edition 似乎也不起作用。如何更改容器中的目录?其他人似乎也有同样的问题,但不得不改变他的管道结构来改变目录,这听起来不像是一个合理的修复。容器中不是已经调用了该步骤吗? https://issues.jenkins-ci.org/browse/JENKINS-46636

【问题讨论】:

    标签: docker jenkins jenkins-pipeline


    【解决方案1】:

    我昨天也遇到了同样的问题。似乎是a bug 导致dir() 在容器内使用时不会更改目录。我可以通过同时执行cdpwd 命令来实现它,如下所示:

    sh '(cd //var/www/html/community-edition && pwd)'
    

    【讨论】:

    • 这个丑陋的解决方案对我有用。如果您在 17.12 之后使用 docker 版本,则该错误似乎已修复。我会尝试升级并再次测试。
    【解决方案2】:

    我遇到了同样的问题,当我在 jenkinsfile 管道中有“ws”时,这对我有用:

       stage('prepare') {
            steps {
                ws('/var/jenkins_home/workspace/pipeline@script/desiredDir') {
                  sh ''
    

    【讨论】:

    • 我在使用 ws()dir() 时遇到了同样的问题。