LoginSignup
0
0

More than 1 year has passed since last update.

Dockerfileでコンテナレジストリのイメージからファイルを取得する方法

Posted at

コンテナイメージを作る

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からコピーすることもできます。

new.dockerfile
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}"とします。

new.dockerfile
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 myimagemyimageをステージとして指定します。
次に、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上にあるどのバージョンからもファイルを取り出して新しいイメージを作ることができます。

アプリケーションのコード変更はないがベースイメージのライブラリなどを変更したい場合に有効な手段です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0