イメージのプル認証が原因でビルド・エラーが発生するのはなぜですか?
仮想プライベート・クラウド クラシック・インフラストラクチャー
Operator Hub や組み込みの開発者コンテンツ・カタログなどから取得したビルドが、Red Hat レジストリーからイメージをプルしようとすると、以下のような認証エラーが発生してビルドが失敗することがあります。
error: build error: After retrying 2 times, Pull image still failed due to error: unauthorized: authentication required
デフォルトでは、Red Hat レジストリーに対するイメージ・プル・シークレット (registry.redhat.io
、registry.connect.redhat.com
、cloud.openshift.com
など) を使用してクラスターがセットアップされます。 さらに、default
プロジェクトには、IBM Cloud Container Registry の <region>.icr.io
レジストリーにアクセスするためのイメージ・プル・シークレットがクラスターにあります。
しかし、オペレーターまたは組み込みのテンプレートに、プライベート・レジストリーからイメージをプルする必要があるビルド・コンポーネントが含まれている場合は、認証エラーが発生してビルドが失敗することがあります。そのビルドは、サービス・アカウントにあるデフォルトのイメージ・プル・シークレットにアクセスできないためです。 デフォルトでは、ビルドは、内部レジストリーに保管されているイメージのみをプルできます。
プライベート・レジストリーからイメージをプルするか、プライベート・レジストリーから内部レジストリーにイメージをインポートすることによって、ビルドがイメージにアクセスできるようにセットアップします。
詳しくは、 Red Hat OpenShift 資料を参照してください。
-
ビルド構成ファイルを確認して、ビルドからのプル・アクセスの対象となっているレジストリーを調べます。 例えば、あなたのビルドが Red Hat OpenShift テンプレートの一部である場合、ビルド設定
spec.strategy.sourceStrategy.from.name
の値は、registry.redhat.io
プライベートレジストリを参照する。oc -n openshift get template react-web-app-example -o yaml
出力例
strategy: sourceStrategy: from: kind: DockerImage name: registry.redhat.io/rhoar-nodejs-tech-preview/rhoar-nodejs-10-webapp
-
イメージ・プル・アクセス権限を設定したビルドをセットアップします。 プライベート・レジストリーからイメージをプルするか、または内部レジストリーからイメージ・ストリームを使用するかのいずれかを選択できます。
- プライベート・レジストリーからイメージをプルする:
-
プロジェクトごとに、ビルドで使用するプライベート・レジストリーへのプル・アクセス権限を設定したイメージ・プル・シークレットを追加します。
- Red Hat レジストリー:
pull-secret
シークレットをopenshift-config
プロジェクトからコピーします。 このシークレットには、cloud.openshift.com
、quay.io
、registry.connect.redhat.com
、およびregistry.redhat.io
のプライベート・レジストリーへのプル・アクセス権限が設定されています。 - IBM Cloud Container Registry の場合:
<region>.icr.io
シークレット をdefault
プロジェクトからコピーします。 - 他のプライベート・レジストリーの場合: プライベート・レジストリーへのイメージ・プル・アクセス権限を設定したイメージ・プル・シークレットを作成します。
- Red Hat レジストリー:
-
シークレットをビルダー・サービス・アカウントに追加するか、ビルド構成ファイルでイメージ・プル・シークレットを指定します。
プロジェクトでビルダー・サービス・アカウントにシークレットをリンクする例。
oc secrets link builder <pull-secret>
ビルド構成ファイルでシークレットを参照する例。
spec: output: to: kind: "DockerImage" name: "<private.registry.com>/<namespace>/<image>:<tag>" pushSecret: name: "<pull-secret>"
-
- 内部レジストリーからイメージ・ストリームを使用する: 内部レジストリーに、プライベート・レジストリーからインポートしたイメージからイメージ・ストリームを作成します。 その後、プライベート・レジストリーからイメージを直接プルするのではなく、イメージ・ストリームを参照するように、ビルド構成ファイルを更新します。
- プライベート・レジストリーからイメージをプルする: