コンテナイメージを作る
Dockerfileを使用して例えばJavaアプリケーションのイメージを作るときは
FROM myregistry.azurecr.io/jdk:latest
COPY app.1.0.jar /myapp/app.jar
のような感じで、事前にMavenなんかでビルドされたjarファイルをコピーして
/kaniko/executor -f /myapp/Dockerfile -c /myapp --destination=myregistry.azurecr.io/myapp:latest
とするとmyregistry.azurecr.io/myapp:latest
ができます。
コンテナイメージにあるjarファイルを再利用
次に、新しいバージョンmyregistry.azurecr.io/myapp:2.0.1
を作りたいが、jarファイルは先ほどのapp.1.0.jar
をそのまま使用したい場合どうすれば良いか。
app.1.0.jar
を何処かに保存しておけばそれをコピーすればいいだけですが、それ以外にもmyregistry.azurecr.io/myapp:latest
からコピーすることもできます。
FROM myregistry.azurecr.io/jdk:latest
COPY --from=myregistry.azurecr.io/myapp:latest /myapp/app.jar /myapp/app.jar
/kaniko/executor -f /myapp/new.Dockerfile -c /myapp --destination=myregistry.azurecr.io/myapp:2.0.1
こうすれば、例えばベースイメージのmyregistry.azurecr.io/jdk:latest
でセキュリティーのパッチなどをしないといけない場合、ベースイメージだけアップデートしてJavaアプリケーションを変更せずに新しいイメージが作成できます。
Dockerfileに変数でコンテナイメージのバージョンを指定
次に、変数を使って任意のイメージからファイルをコピーする場合どうすれば良いか。
先ほどはmyregistry.azurecr.io/myapp:latest
からjarファイルをコピーしました。CI/CDでパイプラン上で指定された任意のバージョンからファイルをコピーする場合、Dockerfileで変数を使います。
/kaniko/executor -f /myapp/new.Dockerfile -c /myapp --build-arg "VERSION=${VERSION}" --destination=myregistry.azurecr.io/myapp:${NEW_VERSION}
まず、kanikoでコピー元のイメージのバージョンを変数"VERSION=${VERSION}"
としてCI/CDなどで指定します。新しく作るイメージのバージョンは"VERSION=${NEW_VERSION}"
とします。
ARG VERSION
FROM myregistry.azurecr.io/myapp:${VERSION} as myimage
FROM myregistry.azurecr.io/jdk:latest
COPY --from=myimage /myapp/app.jar /myapp/app.jar
ここではマルチステージビルドを使用して、まずmyregistry.azurecr.io/myapp:${VERSION} as myimage
でmyimage
をステージとして指定します。
次に、myimage
からjarファイルをコピーします。
変数を使う場合、先ほどのようにマルチステージビルドを使用せずにCOPY --from=myregistry.azurecr.io/myapp:${VERSION}
とすることはできません。一度ステージを作ってそこで変数を受け取る必要があります。
kanikoの実行結果は以下の感じです。
VERSION=2.0.1
NEW_VERSION=2.1.1
Resolved base name myregistry.azurecr.io/myapp:2.0.1 to myimage
Retrieving image manifest myregistry.azurecr.io/myapp:2.0.1
Retrieving image myregistry.azurecr.io/myapp:2.0.1 from registry myregistry.azurecr.io
...
...
Built cross stage deps: map[0:[/myapp/app.jarr]]
Saving file myapp/app.jar for later use
...
...
COPY --from=myimage /myapp/app.jar /myapp/app.jar
Pushing image to myregistry.azurecr.io/myapp:2.1.1
このようにすると、コンテナレジストリmyregistry.azurecr.io/myapp
上にあるどのバージョンからもファイルを取り出して新しいイメージを作ることができます。
アプリケーションのコード変更はないがベースイメージのライブラリなどを変更したい場合に有効な手段です。