私はジェンキンスのDockerビルドを適応させようとしています。私はdocker-composeファイルに従い、各コンテナーを作成してそれらをリンクするJenkinsfileを作成しています。私が実行している問題は、docker-composeファイルがDockerfileの場所ではないコンテキストを宣言していることです。私が理解している限り、jenkinsは、Dockerfileがある場所にコンテキストを設定します。これにより、jenkinsfileファイルまたはdocker-composeファイルが構築されているかどうかに応じて、コピーされるファイルが異なる相対ロケーションに配置されます。
フォルダ構造は次のとおりです。
workspace
|-docker
|-db
|-Dockerfile
|-entrypoint.sh
これは、Dockerfileが問題のファイルのCOPY命令を宣言する方法です
COPY docker/db/entrypoint.sh /
これが私のjenkinsfileがファイルを構築する方法です。私の知る限り、そのディレクトリにコンテキストを配置します
docker.build("db", "${WORKSPACE}/docker/db")
docker-composeファイルは次のように宣言します。
db:
build:
context: .
dockerfile: docker/db/Dockerfile
コンテキストをプロジェクトのルートに置きます。
Jenkinsfileにdocker-composeファイルと同じコンテキストを使用するように指示して、DockerfileのCOPY命令を変更せずに、Jenkinsとdocker-composeの両方に対して有効にする方法はありますか?それが不可能な場合、誰か他の解決策を知っていますか?
以前のバージョン(1.6)のdocker-pipeline-pluginを取得していたことがわかりました。問題の関数は更新され(1.7)、2番目のパラメーターでコンテキスト外のDockerfileの場所を指定できるようになりました。
私のJenkinsfileの更新されたステートメントは次のとおりです。
return docker.build("db", "-f docker/db/Dockerfile .")
これにより、開発者のdocker-composeまたはDockerfilesの予想されるコンテキストを変更せずに、コンテナーをビルドできます。
Build()メソッドは、デフォルトで現在のディレクトリにDockerfileをビルドします。これは、build()メソッドの2番目の引数としてDockerfileを含むディレクトリパスを指定することでオーバーライドできます。次に例を示します。
node {
checkout scm
def testImage = docker.build("test-image", "./dockerfiles/test")
testImage.inside {
sh 'make test'
}
}
context
アイテムをdocker-compose
なので、デフォルトではDockerfileの場所になります。
次の構文が機能するはずです:docker.build( 'ContainerTag' '-f DockerFilePath Context'の例:docker.build( 'quay.io/AppContianer:1.0.0' '-f dockerfileDir/Dockerfile.test dockerfileDir')