Bitbucket Pipelines で Docker コマンドを実行する

Bitbucket Pipelines のビルド パイプラインで Docker コマンドを実行することで、リポジトリの Dockerfile から Docker イメージをビルドし、それを Docker レジストリにプッシュできます。パイプライン環境はデフォルトで提供されているため、カスタマイズをすることなくすぐに利用を開始できます。

Docker へのアクセスの有効化

Docker デーモンへのアクセスを有効化するには、docker をステップにサービスとして追加する (推奨) か、bitbucket-pipelines.yml にグローバル オプションを追加します。

ビルド ステップで Docker をサービスとして追加する (推奨)

pipelines:
  default:
    - step:
        script:
          - ...
        services:
          - docker

Docker を definitions セクションでサービスとして宣言する必要はありません。Docker は定義なしで利用できる、Pipelines で提供されるデフォルト サービスです。

リポジトリのすべてのビルド ステップに Docker を追加する

options:
  docker: true

ここで Docker を宣言した場合も、引き続き Pipelines のサービスとして扱わ、1 GB メモリの制限を持ち、ビルド ステップでは 2 つのサービスとの同時実行が許可されます。この設定は過去のサポートのために提供されたもので、パイプラインで実行できるサービス数の確認で混乱が生じる可能性があるため、ステップ レベルでの設定を行うことをおすすめします。

動作の仕組み

Docker をサービスとして構成すると、次のようになります。

  • Docker CLI 実行ファイルをビルド コンテナでマウント
  • Docker デーモンへのビルド アクセスの実行および提供

これは、docker version を実行することで確認できます。

pipelines:
  default:
    - step:
        script:
          - docker version
        services:
          - docker

オンライン バリデーターを使用して bitbucket-pipelines.yml ファイルをチェックすることができます。

Docker コマンドの実行

Pipelines スクリプトでは、ほとんどの Docker コマンドを実行できます。これらのコマンドの使用方法については「Docker コマンド ラインのリファレンス」を参照してください。

セキュリティ上の理由により、いくつかのコマンドやパラメーターの使用が制限されています。これには、Docker swarm 関連コマンド、docker run --privilegeddocker run --mount、および $BITBUCKET_CLONE_DIR 外部のソースとのボリュームのマッピングが含まれます。

制限されるコマンドの完全な一覧を展開して確認

アトラシアンでは、お客様のデータのセキュリティを非常に重視しています。クラウドにデータを保管している場合は特に注意します。ユーザー データを保護するため、以下が制限されています。

docker container run/docker run では、以下は禁止されています。

  • privileged

  • device

  • mount

  • volume (/opt/atlassian/bitbucketci/agent/build/.* または /opt/atlassian/pipelines/agent/build/.* を除く)

  • pid

  • ipc

  • uts

  • userns

  • security-opt

  • cap-add

  • network

docker container update/docker update では、以下は禁止されています。

  • devices

docker container exec/docker exec では、以下は禁止されています。

  • privileged

docker image build / docker build では、以下は禁止されています。

  • security-opt
  • network

Docker Compose の使用

コンテナで Docker Compose を使用したい場合は、自身のビルド コンテナと互換性のあるバイナリをインストールする必要があります。

外部の Docker デーモンを使用する

他の場所にホストされている独自の Docker デーモンに対してコマンドを実行するようにビルドを構成している場合、それを引き続き利用できます。この場合、Pipelines 内で Docker を有効化するのではなく、独自の CLI 実行ファイルをビルド イメージの一部として提供することをおすすめします。これにより、実行しているデーモン バージョンと CLI バージョンとの互換性を確保します。

Docker レイヤーのキャッシュについて

サービスとして Docker を追加した場合は、ステップに Docker キャッシュも追加できます。キャッシュを追加すると、以前にビルドしたレイヤーを再使用し、ステップでは必要に応じて新しい動的なレイヤーのみを作成するため、ビルドをより速く行うことができます。

pipelines:
  default:
    - step:
        script:
          - docker build ...
        services:
          - docker
        caches:
          - docker # adds docker layer caching 

Docker キャッシュの一般的な使用事例として、イメージのビルドがあります。キャッシュを有効化することでパフォーマンスが低下する場合、dockerfile のレイヤーが無効化されていないことを確認します。

Docker レイヤー キャッシュは、「キャッシュの依存関係」で説明されている通常のキャッシュと同様の制限および挙動を持ちます。

Docker のメモリ制限

既定では、Pipelines の Docker デーモンの合計メモリの上限は 1024 MB です。この割り当てには、docker run コマンド経由で実行するすべてのコンテナと、docker build コマンドの実行に必要なメモリが含まれます。

Docker で利用可能なメモリを増やすには、組み込みの docker サービスのメモリ制限を変更できます。memory パラメーターは 128 MB よりも大きい整数値で、ステップで利用可能なメモリにおさまるようにする必要があります。

以下の例では、docker サービスに、デフォルトの割り当てである 1024 MB の 2 倍 (2048 MB) を提供します。他のサービスや、追加メモリ用に大規模なビルドを構成しているかどうかに応じ、これをさらに増加できます (メモリ制限の詳細をご覧ください)。

pipelines:
  default:
    - step:
        script:
          - docker version
        services:
          - docker
definitions:
  services:
    docker:
      memory: 2048

レジストリへのプッシュ時の認証

レジストリにイメージをプッシュするには、docker login を使用して認証を行ってから docker push を呼び出す必要があります。ユーザー名とパスワードは変数を使用して設定することをおすすめします。

たとえば、パイプラインのスクリプトに次のテキストを追加します。

docker login --username $DOCKER_USERNAME --password $DOCKER_PASSWORD

予約済みのポート

ポートの制限

予約済みの使用できないポートがあります。

  • 29418

最終更新日: 2019 年 2 月 6 日

この内容はお役に立ちましたか?

はい
いいえ
この記事についてのフィードバックを送信する
Powered by Confluence and Scroll Viewport.