web-dev-qa-db-ja.com

Jenkins Docker Pipelineが作業ディレクトリをオーバーライドする

Docker PipelineプラグインでJenkinsを使用しているときに気付きました。 Dockerコンテナーでコマンドを実行するJenkinsファイルを作成すると、実行中のコンテナーの同じパスにマップされた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

私は次のようにDockerのJenkinsfileに引数を指定してこれをオーバーライドしようとしました:

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とボリュームのマッピングはデフォルト設定で上書きされるようです:

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

ボリュームマッピングと作業ディレクトリを上書きする方法はありますか?

10
julianlab

_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'){...}に置き換えました

1
RobM

@Nagri残念ながら、まだ作業ディレクトリとボリュームマッピングを指定できませんでした。

しかし、私はrootとしてjekylllを実行できました。

理想的ではありませんが、少なくとも機能します。

「」

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

「」

1
julianlab

コンテナ内のデフォルトのディレクトリとは異なる作業ディレクトリを使用するという同じ要件がありましたが、現在のところ不可能であることを確認した後、確認しました。詳細はこちらをご覧ください JENKINS-41474JENKINS-35406JENKINS-3351

もう1つの方法は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'
      }
    }
  }
}