Bitbucket Pipelines:「Container 'build' failed to pull image」
スクリプトが動く前に、Pipelines はステップかファイル全体の image: に書いたイメージを引き、そこからビルドのコンテナを起こします。引けないと、ステップは最初のコマンドの前で止まり、次のような行が出ます。Atlassian の課題 BCLOUD-23970(英語)に載っている例です。
Container 'build' failed to pull image: 'failed to pull and unpack image "crg.apkg.io/...": failed to resolve reference "crg.apkg.io/...": pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed'
行の後ろの部分は、レジストリの返事です。レジストリは、名前の誤りにも認証の不足にも同じ「repository does not exist or may require authorization」を返すので、両方を確かめます。
名前とタグ
- Docker Hub のイメージは名前だけで書けます(
node:20、account-name/openjdk:8)。それ以外の場所のイメージは、レジストリのホストから始まるアドレスをまるごと書きます(Atlassian の Docker イメージをビルド環境として使用する)。 - push していないタグも、認証の無いプライベートのイメージと同じ形で落ちます。パイプラインと同じユーザーでログインし、手元で同じ名前のまま
docker pullしてみます。 - イメージはインターネットから届く場所に置きます。英語版の同じページに「internal registries without internet connectivity are not currently supported」(インターネットにつながらない社内のレジストリは今は使えない)とあります。
- イメージの名前を変数で渡すときは、
$VARでなく${{VAR}}と書きます(変数が空になる)。
image の下の username と password
image:
name: account-name/openjdk:8
username: $DOCKER_HUB_USERNAME
password: $DOCKER_HUB_PASSWORD
ほかのレジストリも、アドレスをまるごと書いて同じ2つの欄を使います。email の欄はもう使われておらず、要らないとページにあります。
値が合っているはずなのに断られるときについて、Atlassian の記事 Failed to pull private image in Bitbucket pipelines(英語・2025年9月26日更新)は、いちばんありそうな原因に変数の前後の空白を挙げています。セキュアな変数は中身を読み返せないので、消して作り直します。
AWS ECR
Atlassian のページには2つの方法があります。1つはアクセスキーです。
image:
name: <account-id>.dkr.ecr.<region>.amazonaws.com/openjdk:8
aws:
access-key: $AWS_ACCESS_KEY
secret-key: $AWS_SECRET_KEY
もう1つは、ページが勧めている OpenID Connect で、aws: oidc-role: にロールの ARN を書きます。OpenID Connect を使用して Pipelines で AWS ECR イメージを使用するでは、ステップにも oidc: true を書き、ロールには ecr:GetAuthorizationToken と、リポジトリを読む操作(ecr:BatchGetImage・ecr:GetDownloadUrlForLayer・ecr:BatchCheckLayerAvailability など)を許しています。ID プロバイダと信頼ポリシーは、Pipelines から引き受けるほかのロールと同じです(OIDC で AWS)。
- step:
image:
name: 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-repo:latest
aws:
oidc-role: arn:aws:iam::123456789012:role/pipelines-ecr-access
oidc: true
script:
- echo "hello world"
Atlassian の例とは、違う点が1つあります。例はイメージを ...amazonaws.com/repository/my-repo:latest と書いていますが、ECR のイメージのアドレスに repository/ は入りません。AWS のイメージのプルのページは aws_account_id.dkr.ecr.us-west-2.amazonaws.com/amazonlinux:latest です。repository/ が付くのは、ポリシーの ARN(arn:aws:ecr:...:repository/my-repo)のほうです。
Google Artifact Registry
Atlassian のページは、いまも Google Container Registry(gcr.io)の例で、username に _json_key、password にサービスアカウントの鍵を書いています。Container Registry は 2025年3月18日に終わり、Artifact Registry に載せた gcr.io のアドレスはそのまま使えます(Google の Container Registry からの移行)。<location>-docker.pkg.dev のアドレスには、Google の Artifact Registry に対して Docker を認証するが同じユーザー名の _json_key を使っています。鍵のファイルはダウンロードしたまま渡し、ファイル全体を base64 にしたときは _json_key_base64 にします。
image:
name: us-central1-docker.pkg.dev/my-project/my-repo/build-env:1.0
username: _json_key
password: '$GAR_JSON_KEY'
レジストリのログには、成功した pull の前に断られたリクエストが1つずつ残ることがあります。Atlassian の課題 BCLOUD-23353(英語)によると、Pipelines はまず認証なしで、次に認証つきで取りに行きます。課題は 2025年に変更なしで閉じられ、pull そのものは通ります。
Bitbucket 自身のコンテナのレジストリ
Bitbucket Packages(crg.apkg.io/<workspace>/...)のイメージについて、BCLOUD-23970 の例は username に Atlassian アカウントのメールアドレス、password に API トークンを書いています。この課題が、このページの最初のエラーです。IP Allowlist を有効にしたワークスペースでは、pull が insufficient_scope で落ちます。2026年1月に立ってまだ開いたままで、挙がっている回避策は Allowlist を切ることだけです。
ARM だけのイメージ
クラウドのステップは、ARM を指定しない限り x86 で動きます。Atlassian のステップ オプションに runtime: cloud: arch: arm があり、Standard と Premium のプランで使えます。ARM 向けにだけ作ったイメージは x86 では動きません。push のしかたによって、pull が no match for platform in manifest で止まるか、pull は通って最初のコマンドが exec format error で落ちます。両方の向けにイメージを作るか、ステップを ARM で動かします。
- step:
runtime:
cloud:
arch: arm
image: my-arm-image:1.0
script:
- ./build.sh
いくつものビルドが同時に落ちる
別々のリポジトリで同じころに pull が落ちるなら、Bitbucket のステータスページを見ます。2024年2月には、そこに載った障害の間、セルフホストのランナーが「Unable to pull image」で止まりました。Docker Hub の pull の上限でも toomanyrequests で止まります(「You have reached your pull rate limit」)。
IntelliJ IDEA で Bitbucket Pipelines を見る
Pipeline Inbox for Bitbucket Pipelines は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。Bitbucket Cloud の全部のリポジトリのパイプラインを IDE のツールウィンドウに並べ、ステップ、失敗したステップと止まったコマンド、Bitbucket が書くそばから伸びるステップのログを見せます。一覧・ステップ・ログは無料。パイプラインの実行・やり直し・停止は Pro(月 US$1.50・30日の無料試用つき)。
Atlassian・Bitbucket・Bitbucket Pipelines は Atlassian の商標、Docker は Docker, Inc. の商標、AWS は Amazon.com, Inc. またはその関連会社の商標、Google Cloud は Google LLC の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは Atlassian・Docker・Amazon・Google・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:サービスに「Connection refused」(MySQL・PostgreSQL・Redis) · 「Not authorized to perform sts:AssumeRoleWithWebIdentity」(OIDC で AWS) · テストの結果が出ない · 変数が空になる · 「Host key verification failed」(SSH) · 「Cannot connect to the Docker daemon」 · 「authorization denied by plugin pipelines」(Docker) · 「Container 'docker' exceeded memory limit.」 · push したのに Pipelines が動かない · 「Container 'Build' exceeded memory limit.」 · 「Exceeded build time limit of 120 minutes」 · キャッシュが効かない · 「unexpected system error」 · 「command not found」 · サブモジュールを取ってこない · 「We couldn't clone the repository」 · 「No online runner available」 · 「No space left on device」 · 「Step exceeded processing limits」 · 次のステップにアーティファクトが無い · 前は通ったビルドが今は落ちる · Build setup に時間がかかる · ビルド時間を使い切った · 「Permission denied to update branch」 · 「You have reached your pull rate limit」(Docker Hub) · 「There is an error in your bitbucket-pipelines.yml」 · 「This pipeline was paused」(デプロイ) · スケジュールしたパイプラインが動かない · IntelliJ IDEA の Bitbucket Pipelines 用プラグインの比較 · English