目的
IBM Cloud Container Registry(ICR)はIBM Cloudが提供するコンテナレジストリサービスです。ICRにイメージを登録する方法はいくつかありますが、最近IBM Cloud CLIを使った方法が非推奨になってしまったので、代替策も含めて紹介します。
サンプルアプリ
当手順で使用するソースコードやDockerfileはGitHubで公開していますので、参考にしてください。
方法
IBM Cloud Container Registry CLIを使用する(現在非推奨)
IBM Cloud Container Registry CLIはもともとイメージをビルドし登録する機能がありました。これを使うとローカルにdockerやpodmanをインストールしておく必要がなく楽でした。しかし残念ながら2021年9月からこの方式は非推奨となり、今後廃止されることになりました。現時点(2021年9月)では--accept-deprecation
オプションを付与しないと動かなくなっています。
$ git pull
$ ibmcloud region-set jp.icr.io
$ ibmcloud cr build -t jp.icr.io/teruq/sample-app:1.0.0 .
失敗
The 'build' command is deprecated, you must specify the --accept-deprecation option to use this command. For more information see: https://www.ibm.com/cloud/blog/announcements/ibm-cloud-container-registry-deprecating-container-builds
$ ibmcloud cr build -t jp.icr.io/teruq/sample-app:1.0.0 --accept-deprecation .
警告: build コマンドは推奨されません。 詳しくは、次のページを参照してください: https://www.ibm.com/cloud/blog/announcements/ibm-cloud-container-registry-deprecating-container-builds
Sending build context to Docker daemon 194.7MB
(略)
OK
DockerやPodmanを使用する
DockerやPodmanを使用する方法です。ibmcloud cr login
を実行することでdockerやpodmanコマンドからICRを利用できるようになります。しかしこのためにそれぞれのツールをローカルにインストールする必要があります。
$ git pull
$ ibmcloud cr region-set jp.icr.io
$ ibmcloud cr login
$ docker build -t jp.icr.io/teruq/sample-app:1.0.0 .
$ docker push jp.icr.io/teruq/sample-app:1.0.0
IBM Cloud Code Engineのビルド機能を使用する
少々変則的な使い方ですが、IBM Cloud Code Engineのビルド機能を使うことで、ICRへのイメージ登録を行うことができます。DockerやPodmanは不要です。また、Dockerfileやソースコードをあらかじめローカルにpullする必要がないところも楽です。
プロジェクトの作成
Code Engineのプロジェクトを作成します。ビルドの種類ごとに分ける必要はないので1つあればよいでしょう。
$ ibmcloud ce project create --name image-build
プロジェクト 'image-build' を作成中...
プロジェクト「image-build」の ID は「72ed867c-5480-4c6c-b840-801fcf4bd419」です。
プロジェクト 'image-build' がアクティブになるのを待機しています...
プロジェクト 'image-build' の選択中。
OK
アクセスシークレットの登録
ICRにアクセスするためのシークレットを登録します。これも1つあればよいでしょう。--password
はICRに更新権限のあるAPIキーです。
$ ibmcloud ce registry create --name jp-icr-io-teruq --password ******** --server jp.icr.io
イメージ・レジストリーのアクセス・シークレット 'jp-icr-io-teruq' を作成中...
OK
ビルドの作成
$ ibmcloud ce build create --name sample-app --image jp.icr.io/teruq/sample-app:1.0.0 --registry-secret jp-icr-io-teruq --source https://github.com/teruq-sample/sample-app.git --commit master --size small
ビルド 'sample-app' を作成中...
OK
ビルドの実行
$ ibmcloud ce buildrun submit --build sample-app --wait
ビルド実行 'sample-app-run-210917-013517853'を送信中...
ビルド実行が完了するのを待機しています...
ビルド実行状況: '実行中'
ビルド実行が正常に完了しました。
ビルド実行の状況を確認するには、'ibmcloud ce buildrun get -n sample-app-run-210917-013517853' を実行してください。
OK
ビルドログの確認
$ ibmcloud ce buildrun logs --buildrun sample-app-run-210917-013517853
(略)
#13 exporting to image
#13 pushing layers 2.8s done
#13 pushing manifest for jp.icr.io/teruq/sample-app:1.0.0@sha256:94ec1c570ac434dced550cba328229b57d5123fb83048d124a1df31497e97c3f
#13 pushing manifest for jp.icr.io/teruq/sample-app:1.0.0@sha256:94ec1c570ac434dced550cba328229b57d5123fb83048d124a1df31497e97c3f 0.4s done
#13 DONE 8.6s
Red Hat OpenShift on IBM CloudのBuildを使用する
これも少々変則的ですが、Red Hat OpenShift on IBM Cloud(ROKS)のユーザーであれば、ROKSのBuildを使ってICRにイメージ登録することができます。
レジストリシークレットの登録
ICRにイメージをプッシュ可能なシークレットを作成します。--docker-password
はICRに更新権限のあるAPIキーです。
$ oc create secret docker-registry jp-icr-io-teruq --docker-server jp.icr.io --docker-username iamapikey --docker-password ******** --docker-email a@b.c
secret/jp-icr-io-teruq created
サービスアカウントにレジストリシークレットをリンク
BuildConfigによるBuildコンテナがICRにイメージをプッシュできるよう、サービスアカウントにレジストリシークレットをリンクします。
$ oc secrets link builder jp-icr-io-teruq
ビルドの実行
BuildCondigを作成して実行します。--to-docker
を指定することで生成されたイメージを外部のレジストリに登録することを指定し、--to
でICRを指定します。
$ oc new-build https://github.com/teruq-sample/sample-app.git --to-docker --to jp.icr.io/teruq/sample-app:1.0.0
--> Found image d0a3436 (2 months old) in image stream "default/open-liberty" under tag "21.0.0.7-full-java8-openj9" for "open-liberty:21.0.0.7-full-java8-openj9"
* A Docker build using source code from https://github.com/teruq-sample/sample-app.git will be created
* The resulting image will be pushed with Docker to "jp.icr.io/teruq/sample-app:1.0.0"
* Use 'oc start-build' to trigger a new build
--> Creating resources with label build=sample-app ...
buildconfig.build.openshift.io "sample-app" created
--> Success
ビルドログの確認
ビルドログを確認します。
$ oc get pods
NAME READY STATUS RESTARTS AGE
sample-app-1-build 1/1 Running 0 3s
$ oc logs -f sample-app-1-build
Pushing image jp.icr.io/teruq/sample-app:1.0.0 ...
Getting image source signatures
Copying blob sha256:3f0cfe4ac5fafbc38dd1ca8759c632b0dc2b7ad895a75900a6734b695d6b4097
(略)
Copying config sha256:3d40901987e5747876bd832628ea6dc4b7a6c28d47baad89ee221bf159f3f9cd
Writing manifest to image destination
Storing signatures
Successfully pushed jp.icr.io/teruq/sample-app@sha256:800ec73d5084ca3f485ee3c74c25632b21e9d78387f5d8bfe1f9bc87790f54f5
Push successful
IBM Cloud ToolChainサービスを使用する
IBM CloudのCI/CD機能を使ってICRへイメージ登録することができます。
ツールチェーンの作成
下記URLから、Build your ownツールチェーンを選択します。
名前をつけて作成します。
ツールの追加を選択します。
IBM CloudのGitLabを使用する場合は左を、github.comを使用する場合は右を選択します。今回は右のGitHubを使用します。
初回の場合、GitHubの認証を行います。
Authorize IBM-Cloudを選択します。
リポジトリータイプを既存にし、リポジトリーURLを指定します。統合の作成を選択します。
再度ツールの追加を選択します。
Delivery Pipelineを選択します。
名前を付けて作成します。
Delivery Pipelineを選択します。
ステージの追加を選択します。
入力タイプ、リポジトリー、ブランチを選択します。ステージトリガーは今回は手動にします。
ジョブタブを選択し、ビルドジョブを追加します。
ビルダータイプをContainer Registryにします。
名前空間、イメージ名を指定します。
ビルドスクリプトを2か所書き換えます。デフォルトだとイメージのタグがBUILD_NUMBERという連番になりますが、今回はバージョンを明示したいためです。
#!/bin/bash
echo -e "ビルド環境変数:"
echo "REGISTRY_URL=${REGISTRY_URL}"
echo "REGISTRY_NAMESPACE=${REGISTRY_NAMESPACE}"
echo "IMAGE_NAME=${IMAGE_NAME}"
echo "BUILD_NUMBER=${BUILD_NUMBER}"
echo "IMAGE_TAG=${IMAGE_TAG}" # 追加
# 環境変数についての詳細::
# https://cloud.ibm.com/docs/services/ContinuousDelivery?topic=ContinuousDelivery-deliverypipeline_environment#deliverypipeline_environment
# ビルド・オプションを確認または変更するには、次の項目を使用します::
echo -e "リポジトリー・ルートで Dockerfile を検査しています"
if [ -f Dockerfile ]; then
echo "Dockerfile が見つかりました"
else
echo "Dockerfile が見つかりません"
exit 1
fi
#ensure docker and buildkit are present if not already in current pipeline-base-image
which buildctl > /dev/null || (curl -fsSL https://github.com/moby/buildkit/releases/download/v0.8.0/buildkit-v0.8.0.linux-amd64.tar.gz | tar zxf - --strip-components=1 -C /usr/bin bin/buildctl)
which docker > /dev/null || (curl -fsSL https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz | tar zxf - --strip-components=1 -C /usr/bin docker/docker)
FULL_IMAGE_NAME=$REGISTRY_URL/$REGISTRY_NAMESPACE/$IMAGE_NAME
#Classic pipeline Container Registry job requires PIPELINE_IMAGE_URL to be defined, so the next deploy job could access this value:
#export PIPELINE_IMAGE_URL="${FULL_IMAGE_NAME}:$BUILD_NUMBER"
export PIPELINE_IMAGE_URL="${FULL_IMAGE_NAME}:${IMAGE_TAG}" # BUILD_NUMBERからIMAGE_TAGに変更
echo -e "コンテナー・イメージをビルドしています"
set -x
ibmcloud cr login
buildctl build --frontend dockerfile.v0 --local context=. --local dockerfile=. \
--output type=image,name=${PIPELINE_IMAGE_URL},push=true \
--export-cache type=registry,ref=${FULL_IMAGE_NAME}:buildcache \
--import-cache type=registry,ref=${FULL_IMAGE_NAME}:buildcache
set +x
環境プロパティタブを選択します。
IMAGE_TAGプロパティを追加します。最後に保存します。
ビルドの実行
▶ボタンを選択するとビルドが開始されます。
状況はログおよび履歴の表示で確認することができます。
比較
方法 | Docker/Podmanが必要 | ソースの置き場所 |
---|---|---|
IBM Cloud Container Registry CLI | No | ローカル |
Docker/Podman | Yes | ローカル |
IBM Cloud Code Engineのビルド機能 | No | Gitのみ |
Red Hat OpenShift on IBM CloudのBuild | No | ローカルとGitどちらも可能 |
IBM Cloud ToolChainを使用 | No | Gitのみ |