4
3

More than 1 year has passed since last update.

IBM Cloud Container Registryにイメージを登録するいくつかの方法

Last updated at Posted at 2021-09-16

目的

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ツールチェーンを選択します。

https://cloud.ibm.com/devops/create

image.png

名前をつけて作成します。

image.png

ツールの追加を選択します。

image.png

IBM CloudのGitLabを使用する場合は左を、github.comを使用する場合は右を選択します。今回は右のGitHubを使用します。

image.png

初回の場合、GitHubの認証を行います。

image.png

Authorize IBM-Cloudを選択します。

image.png

リポジトリータイプを既存にし、リポジトリーURLを指定します。統合の作成を選択します。

image.png

再度ツールの追加を選択します。

image.png

Delivery Pipelineを選択します。

image.png

名前を付けて作成します。

image.png

Delivery Pipelineを選択します。

image.png

ステージの追加を選択します。

image.png

入力タイプ、リポジトリー、ブランチを選択します。ステージトリガーは今回は手動にします。

image.png

ジョブタブを選択し、ビルドジョブを追加します。

image.png

image.png

ビルダータイプをContainer Registryにします。

image.png

名前空間、イメージ名を指定します。

image.png

ビルドスクリプトを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.png

IMAGE_TAGプロパティを追加します。最後に保存します。

image.png

image.png

ビルドの実行

▶ボタンを選択するとビルドが開始されます。

image.png

状況はログおよび履歴の表示で確認することができます。

image.png

比較

方法 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のみ
4
3
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
4
3