現時点での結論
daemonとして動かすことを想定しているようなので、 それ以外で使う場合、例えばビルドにはJenkinsの機能は使わないほうが良さそうです。 いろいろ格闘したんですが、うまくいかなかったので。。。
実行時の注意
共通で -d
オプションが付き、さらに --entrypoint cat
が付くので、
実行したいものはJenkinsfileに sh
で直接コマンドを書く。
-d
オプションなしはissueとして上がっている1。
- Docker実行には、1つexecutorを消費する模様。
- 実行時に自動的に以下のオプションが付く。
- 共通
-d
: バックグラウンド実行
- Declarative Pipeline,
inside
-t
-u <JenkinsのUID>:<JenkinsのGID>
-w <ワークスペースのパス>
-v
: ワークスペースの内容をマップしているようです。--entrypoint cat
- 共通
UID/GIDの取得
- UID:
env.UID
でできるらしい(未確認)。 - GID: 不可能な模様。
- jenkins - How to get GID of group on host in Dockerfile - Stack Overflow
- 組織内でGIDを決めておくほうが良いと書かれている。
Jenkinsfileの書き方
stageの中に書く / 外部イメージを指定する場合
stage ('...') {
agent {
docker {
image "..."
args "..."
}
}
}
stageの中に書く / Dockerfileを指定する場合
stage ('...') {
agent {
dockerfile {
dir "..."
additionalBuildArgs "..."
args "..."
}
}
}
複雑な環境の場合
標準のオプションを置き換える場合は、 Scripted Pipelineを使って自前で書いたほうが良さそうです。
-w
-u
以下のようなイメージで。
stage ('...') {
steps {
sh 'docker build .'
script {
docker.image("centos").withRun('-v $HOME/.m2:/root/.m2") {
sh 'ls'
}
}
}
}