Runtime v3 を有効にして使用する

Bitbucket Pipelines ランタイム v3 では、Docker サービスをより柔軟に使用できます。最近のセキュリティ改善により、以前の Docker 制限の一部が緩和されました。

ランタイム v3 の機能

  • Pipelines 内で Docker API へのより直接的なアクセスが可能になります。これには、privileged コンテナーの使用も含まれます。特権コンテナーのセクションを参照してください。

  • 顧客が docker buildx にアクセスできるようになり、マルチアーキテクチャ イメージを構築する際の効率が大幅に向上します。Docker Buildx のセクションを参照してください。

  • Docker CLI を直接制御できるため、顧客は、Pipelines によって提供されるバージョンに依存せずに、ビルドに必要な CLI の正確なバージョンを指定できます。BYO Docker CLI のセクションを参照してください。

  • 顧客が独自の Docker-in-Docker (DinD) イメージを持ち込むことができるため、ビルド環境をより細かく制御できるようになります。BYO DinD のセクションを参照してください。

ランタイム v3 を有効にする

ランタイム v3 を有効にするには、パイプライン設定でランタイム バージョンを指定して、この機能にオプトインする必要があります。bitbucket-pipelines.yml ファイルに次の行を追加します。

options: runtime: cloud: version: 3

特定のステップで有効にするには、bitbucket-pipelines.yml ファイルに次の行を追加します。

- step: runtime: cloud: version: 3

次に挙げるのは、ランタイム v3 で導入された主な変更点、その詳細情報、およびそれらを効果的に活用する方法の例です。

制限事項

Docker CLI のマウントの取り止め

前述のとおり、Docker CLI はビルド コンテナーに自動的にマウントされなくなりました。したがって、ランタイム v3 で Docker を使用するには、CLI がイメージに含まれているか、ビルド ステップ中にインストールされていることを確認してください。

Docker キャッシュの廃止

Bitbucket Pipelines の Docker キャッシュ機能は廃止されました。つまり、ステップでこの機能を使用しようとすると無視され、警告メッセージが表示されます。

この目的には Buildx キャッシュを使用することをお勧めします。


特権コンテナー

Docker で特権コンテナーを利用することで、より高度なコンテナー ワークフローを実行できます。

docker run は、--privileged フラグを含む任意の引数で使用できます。以前のランタイム バージョンでは、共有環境内での潜在的なセキュリティ リスクを防ぐためにこれが制限されていました。ただし、最近の変更により、コンテナーの分離が改善され、サンドボックスが強化されたため、ビルド ステップで特権モードを安全に使用できるようになりました。

これが重要な理由

--privileged を使用すると、次のようないくつかの高度な Docker 機能が利用可能になります。

  • Docker-in-Docker (DinD) を制限なく実行できる

  • コンテナー内の低レベルのシステム操作にアクセスできる

  • loopback デバイスやカスタム カーネル モジュールなど、完全な機能やマウントを必要とするソフトウェアを使用できる

privileged-docker-run: - step: runtime: cloud: version: 3 image: "<my-image-with-docker-cli>" services: - docker script: - docker run --privileged alpine:3 sh -c "echo 20 > /proc/sys/vm/swappiness && cat /proc/sys/vm/swappiness"

特権モードは現在サポートされていますが、注意して使用する必要があります。絶対に必要な場合にのみ使用し、実行するイメージが信頼できるものであることを確認してください。

--privileged を有効にすると、ランタイム v3 では、ローカル開発環境に合わせたり、これまで Pipelines でサポートされていなかった複雑なツールを実行したりするための柔軟性がユーザーにもたらされます。


Docker Buildx

Bitbucket Pipelines ランタイム v3 では、マルチプラットフォーム イメージのビルド、高度なキャッシュ、およびきめ細かい Docker ビルドのための強力な拡張機能である Docker Buildx が完全にサポートされています。Buildx により、より高速で柔軟なビルドが可能になり、Docker BuildKit の機能を最大限に活用できるようになります。

パイプラインで Buildx を有効にする

Buildx を使用するには、まずパイプライン イメージに Docker CLI と Buildx プラグインがインストールされていることを確認してください。有効にすると、ステップ内で高度な docker buildx build コマンドを直接実行できるようになります。

Docker CLI と Buildx をインストールする

ビルド コンテナーに Docker CLI を配置するには、次の 2 つの方法があります。

  • 一方のオプションは、スクリプト セクションの一部としてインストールすることです。

  • ただし、ビルド イメージの一部としてインストールする方が効率的です。

次の例では、Dockerfile を通じて、Docker CLI とともに、docker-composedocker-buildx プラグインなどのその他の便利な依存関係をコピーしています。

FROM docker:28.1.1-cli AS docker-cli FROM ubuntu:24.04 # Copy Docker CLI, Buildx plugin and docker-compose COPY --from=docker-cli /usr/local/bin/docker /usr/local/bin/docker COPY --from=docker-cli /usr/local/libexec/docker/cli-plugins/docker-buildx /usr/local/libexec/docker/cli-plugins/docker-buildx COPY --from=docker-cli /usr/local/bin/docker-compose /usr/local/bin/docker-compose # etc..

マルチアーキテクチャ ビルド

Docker Buildx を利用して、パイプライン内で直接マルチプラットフォーム Docker イメージをビルドできるようになりました。Docker Buildx は Docker のビルド機能の拡張機能であり、単一のパイプライン実行から複数のアーキテクチャ (x86_64arm64armv7 など) のイメージをビルドできるため、クロスプラットフォーム開発のための強力なツールとなります。

Docker Buildx では、強化されたキャッシュ機能、優れたパフォーマンス、より高度なビルド オプションとの連携 (BuildKit を使用したイメージのビルドなど) も提供されます。

options: runtime: cloud: version: "3" pipelines: custom: multi-arch-build: - step: image: "<my-image-with-docker-cli-and-buildx>" services: - docker script: - docker buildx create --name multiarch-builder --driver docker-container --use - docker buildx inspect --bootstrap - docker run --rm --privileged tonistiigi/binfmt --install all - docker buildx build -t test:local --platform=linux/amd64,linux/arm64 .

Buildx によるビルド キャッシュ

Buildx は、パイプラインを高速化し、冗長な計算を削減し、クロスステップのパフォーマンスを向上させる高度なキャッシュ戦略にも対応しています。Bitbucket Pipelines では次のキャッシュ タイプがサポートされています。

リモート S3 キャッシュ

S3 バケットを使用して、ビルド、ランナー、さらにはリポジトリ間でキャッシュ レイヤーを永続化します。

options: runtime: cloud: version: "3" pipelines: custom: remote-cache: - step: image: "<my-image-with-docker-cli-and-buildx>" services: - docker name: "upload cache" oidc: true script: - export AWS_DEFAULT_REGION="us-east-1" - export AWS_ROLE_ARN="arn:aws:iam::123456789012:role/pipeline-role" - export AWS_WEB_IDENTITY_TOKEN_FILE="$(pwd)/web-identity-token" - echo $BITBUCKET_STEP_OIDC_TOKEN > $(pwd)/web-identity-token - docker buildx create --name dc --driver docker-container --use - docker buildx build -t test:local --builder=dc --load --platform=linux/amd64 --cache-to type=s3,region=us-west-2,bucket=my-s3-bucket,name=${BITBUCKET_BUILD_NUMBER} . - docker run test:local - step: image: "<my-image-with-docker-cli-and-buildx>" services: - docker name: "use cache on build" oidc: true script: - export AWS_DEFAULT_REGION="us-east-1" - export AWS_ROLE_ARN="arn:aws:iam::123456789012:role/pipeline-role" - export AWS_WEB_IDENTITY_TOKEN_FILE="$(pwd)/web-identity-token" - echo $BITBUCKET_STEP_OIDC_TOKEN > $(pwd)/web-identity-token - docker buildx create --name dc --driver docker-container --use - docker buildx build -t test:local --builder=dc --load --platform=linux/amd64 --cache-from type=s3,region=us-west-2,bucket=my-s3-bucket,name=${BITBUCKET_BUILD_NUMBER} . - docker run test:local

ビルド環境には、S3 バケットにアクセスする権限を持つ AWS 認証情報が必要です。

ローカル キャッシュ

ローカル キャッシュでは、パイプライン ステップ間 (同じランナー上) で共有できるディレクトリにビルド レイヤーが保存されます。

options: runtime: cloud: version: "3" pipelines: custom: local-cache: - step: image: "<my-image-with-docker-cli-and-buildx>" services: - docker script: - docker buildx create --use - docker buildx build --tag my-image:latest --cache-to=type=local,dest=/tmp/.buildx-cache --cache-from=type=local,src=/tmp/.buildx-cache .

このキャッシュ ディレクトリをステップ間で永続化する場合は、パイプラインで artifacts セクションを使用します。

レート制限を回避する

Buildx ビルド中にレート制限に達するのを回避するための一般的な方法は、Docker レジストリにログインすることです。

options: runtime: cloud: version: "3" pipelines: custom: docker-hub-login: - step: script: - echo "$DOCKERHUB_PASSWORD" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin - docker buildx create --name mybuilder --driver docker-container --use - docker buildx build -t myimage:latest .

もう 1 つの方法は、カスタム Docker レジストリ ミラーを設定することです。アトラシアンのサーバーは AWS us-east-1 で実行されるため、レイテンシーを削減し、最適なパフォーマンスを確保するために、同じリージョンまたは近くにミラーを設定することをお勧めします。

options: runtime: cloud: version: "3" pipelines: custom: custom-registry-mirror: - step: script: - | cat <<EOF > buildkitd.toml debug = true [registry."docker.io"] mirrors = ["<your-registry-mirror>"] EOF - docker buildx create --config ./buildkitd.toml --name mybuilder --driver docker-container --use - docker buildx build -t myimage:latest . - docker logs buildx_buildkit_mybuilder0

docker logs コマンドは、それが機能したことを確認するためのものです。


独自の (BYO) Docker CLI を持ち込む

以前のランタイムでは、固定バージョンの Docker CLI がビルド コンテナーに自動的にマウントされていました。現在はそれが取り止められています。代わりに、ランタイム v3 で Docker を使用するには、CLI がイメージに含まれているか、ビルド ステップ中にインストールされていることを確認してください。これにより、新しい Docker 機能の使用を希望するユーザーにとって柔軟性が向上します。

Docker CLI をインストールする

ビルド コンテナーに Docker CLI を配置するには、次の 2 つの方法があります。

  • 一方のオプションは、スクリプト セクションの一部としてインストールすることです。

  • ただし、ビルド イメージの一部としてインストールする方が効率的です。

次の例では、Dockerfile を通じて、Docker CLI とともに、docker-composedocker-buildx プラグインなどのその他の便利な依存関係をコピーしています。

FROM docker:28.1.1-cli AS docker-cli FROM ubuntu:24.04 # Copy Docker CLI, Buildx plugin and docker-compose COPY --from=docker-cli /usr/local/bin/docker /usr/local/bin/docker COPY --from=docker-cli /usr/local/libexec/docker/cli-plugins/docker-buildx /usr/local/libexec/docker/cli-plugins/docker-buildx COPY --from=docker-cli /usr/local/bin/docker-compose /usr/local/bin/docker-compose # etc..

新しい既定のイメージ

新しい atlassian/default-image:5 には Docker CLI が含まれています。ただし、このイメージが将来も変更されないことは保証できないため、独自のカスタム イメージを使用することを強くお勧めします。


BYO Docker-in-Docker (DinD)

ランタイム v3 では、独自の (BYO) Docker-in-Docker (DinD) イメージの持ち込みがサポートされています。この機能により、特定のニーズに合ったカスタム Docker イメージを指定できるようになり、柔軟性が向上します。公式の Docker DinD イメージを使用することも、AWS ECR などのコンテナー レジストリ、または任意の別のレジストリでホストされている非公開イメージを使用することもできます。

公式の Docker DinD イメージを使用する

次の例では、Docker サービス用の公式の docker:28-dind イメージを使用しています。これはパイプライン内で DinD を設定する最も簡単な方法です。

definitions: services: docker: image: name: docker:28-dind type: docker

AWS ECR からのカスタム Docker イメージを使用する

この例では、OIDC ベースの認証用の適切な AWS IAM ロールとともに、AWS ECR でホストされているカスタム Docker イメージを指定できます。

definitions: services: docker: image: name: 0123456789012.dkr.ecr.us-west-2.amazonaws.com/my-image-from-ecr:latest aws: oidc-role: arn:aws:iam::0123456789012:role/my-pipeline-role type: docker

既定の DinD イメージ

Pipelines の以前のランタイム環境では、セキュリティ上の理由から、アトラシアンの非公開 DinD イメージを使用していましたが、これは古くなることがありました。現在は、イメージの指定がなければ、既定で docker:dind が使用されます。ただし、Docker サービスを使用する場合は、常に Docker イメージを固定することをお勧めします。そのための方法については、上記の「BYO Docker-in-Docker (DinD)」セクションで説明されています。

既定の DinD 引数

以前のランタイム バージョンでは、DinD は次の引数を使用して実行されていました。

--authorization-plugin=pipelines \ --storage-driver=overlay2 \ --registry-mirror http://${DOCKER_REGISTRY_MIRROR_HOST}:5000 \ --insecure-registry ${DOCKER_REGISTRY_MIRROR_HOST}:5000 \ --userns-remap=default \ --tls=false \ --log-level info

ランタイム v3 では、次の引数が使用されます。次の例では、DOCKER_REGISTRY_MIRROR_HOST 環境変数は内部 Docker レジストリ ミラー IP を指しています。

--storage-driver=overlay2 --registry-mirror http://${DOCKER_REGISTRY_MIRROR_HOST}:5000 --insecure-registry ${DOCKER_REGISTRY_MIRROR_HOST}:5000 --tls=false --log-level info

現時点では、これらの引数を上書きすることはできません。

ユーザー名前空間の再マッピングの無効化

ユーザー名前空間の再マッピング (つまり、--userns-remap) は Docker サービスでは既定で無効になっています。これにより、一貫したユーザー ID またはコンテナー内での書き込みアクセスを必要とするビルド プロセスとの互換性が向上します。

これが重要な理由

  • この変更により、ボリュームの権限が簡素化され、ボリュームをマウントする際やコンテナー内で useradd を実行する際に発生する問題を回避できます。

  • Dind ビルド内の UID/GID マッピングについて心配する必要がなくなりました。

Dind ルート ファイルシステムへの書き込みアクセス

以前のバージョンとは異なり、DinD コンテナーのルート ファイルシステムへの書き込みアクセスが許可されます。

これによって可能になること

  • DinD コンテナー内で直接パッケージをインストールしたり、ファイルを変更したりできます。

  • ビルド中に DinD イメージをその場で簡単にカスタマイズできます。

さらにヘルプが必要ですか?

アトラシアン コミュニティをご利用ください。