Docker を使用してローカルでパイプラインをデバッグする

Docker を使用して、Bitbucket Pipelines のビルドをローカルでテストできます。Docker イメージが適切かどうか、またはビルドしようとしたときに Pipelines でメモリの問題が発生するかどうかを確認する際に便利です。

このガイドでは次の 3 段階のテストについて説明します。

  • コンテナのビルドのテスト

  • コンテナの実行のテスト

  • コンテナ内でのコマンドの実行のテスト

詳細については、Docker のドキュメントを参照してください。

はじめる前に

ローカル環境を準備します。bitbucket-pipelines.yml ファイルの準備ができている Bitbucket リポジトリのローカル コピーがあることを確認します。

repo のクローンを作成する方法 - 下記を参照してください

要約:

$ cd /Users/myUserName/code

$ git clone git@bitbucket.org:myBBUserName/localDebugRepo.git

詳細なガイドラインは、「リポジトリのクローン」を参照してください。

このシナリオでは、次の bitbucket-pipelines.yml ファイルをテストします。

1 2 3 4 5 6 7 8 9 # You can use a Docker image from Docker Hub or your own container # registry for your build environment. image: python:2.7 pipelines: default: - step: script: # Modify the commands below to build your repository. - docker --version
1 2 - python --version - python myScript.py

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

ステップ 1: マシンに Docker をインストールする

インストール手順は、使用するオペレーティング システムによって異なります。Docker が提供しているインストール ガイドラインに従ってください。

Doker をインストールしたら、ターミナルに移動して以下を実行します。

$ docker --version

SSH をインストール済みの場合、コマンドはバージョンの詳細情報を返し、適切にインストールされていることを示します。Bitbucket での実行時にローカル バージョンがパイプラインで使用されているバージョンと一致していることを確認してください。異なる場合、互換性の問題が発生する可能性があります。

Docker のインストールを完了すると、独自のカスタム イメージをビルドしたり、既存のイメージ (Docker Hub からダウンロード可能なものなど) を使用したりすることができます。

ステップ 2: カスタム Docker イメージのビルドをテストする

独自イメージのビルドでは、コンテナを定義するための dockerfile を定義済みであることを前提としています。dockerfile がない場合、イメージの作成手順または Docker の公式スタート ガイドを参照してください。

$ docker build --memory=1g --memory-swap=1g -t account/imageName:tag -f my.dockerfile .

ここで:

docker build

Docker イメージのビルドを行うことを指定します。

 

1 --memory=1g --memory-swap=1g

スワップ領域を持たない 1 GB メモリのコンテナをビルドします (スワップはスワップ値 - メモリ値で計算されます)。このメモリ量は 1 つのサービス コンテナでの Pipelines のメモリ制限のシミュレーションを行います (両方のフラグが必要です)。 

ローカルでデバッグする際には、可能な限り Pipelines に近い状態を再現するためにメモリ制限を設定して、Pipelines のメモリ制限に該当しないことを確認することをおすすめします。ローカルで合格するパイプラインが失敗する原因の多くはメモリ制限です。

Docker ドキュメントでメモリの管理に関する詳細を確認できます。

macOS (OS X)

docker stats コマンドを使用して、コンテナの実際のメモリ制限を確認します。

ステータス バーで既定のメモリ設定を変更できます ( > [設定] > [詳細設定])。

-t accountName/imageName:tag

指定された名前、イメージ名、およびタグで、アカウントのイメージを作成します。

-f my.dockerfile

イメージのビルド時に使用する docker ファイルの名前を指定します。

.

docker ビルド コンテキストでルートとして使用するディレクトリを指定します (指定しない場合はカレント)。

Pipelines ファイルでイメージを定義していない場合、アトラシアンの既定のイメージが使用されます。

ステップ 3: Docker コンテナの実行をテストする

コンテナをビルド済みの場合、実行をテストできます。この例では、Docker Hub の python 2.7 イメージを使用します。

$ docker run -it --volume=/Users/myUserName/code/localDebugRepo:/localDebugRepo --workdir="/localDebugRepo" --memory=4g --memory-swap=4g --memory-swappiness=0 --cpus=4 --entrypoint=/bin/bash python:2.7

ここで:

docker run -it

TTY と STDIN open の状態で Docker コンテナを実行します。つまり、コンテナは対話モードで開き、ユーザーはコンテナ内でコマンドを実行できます。

--volume=/Users/myUserName/code/localDebugRepo:/localDebugRepo

/Users/myUserName/code/localDebugRepo という名前のローカル ディレクトリをコンテナ内に /localDebugRepo としてマウントします。

注意

コンテナ内で発生するリポジトリ コンテンツへの変更は、ご使用のリポジトリのローカル クローンに反映されます。

詳細を表示

このコマンドは既定の設定で実行され、コンテナにはリポジトリに対する読み取りおよび書き込み権限が付与されます。コマンドの末尾に :ro を追加することで、ローカル ディレクトリへのアクセスを読み取り専用に制限できます。

-- volume=/Users/myUserName/code/localDebugRepo:/localDebugRepo:ro

--workdir="/localDebugRepo"

開始点となるディレクトリを設定します。このディレクトリでコマンドが実行されます。既定では、コンテナのルート ディレクトリになります。

1 --memory=4g --memory-swap=4g --memory-swappiness=0

ビルド コンテナでの Pipelines のメモリ制限をシミュレーションするコンテナを、メモリ 4 GB、スワップ領域なしで実行します (3 つのフラグすべてが必要です)。

ローカルでデバッグする際には、可能な限り Pipelines に近い状態を再現するためにメモリ制限を設定して、Pipelines のメモリ制限に該当しないことを確認することをおすすめします。ローカルで合格するパイプラインが失敗する原因の多くはメモリ制限です。

Docker ドキュメントでメモリの管理に関する詳細を確認できます。

macOS (OS X)

docker stats コマンドを使用して、コンテナの実際のメモリ制限を確認します。

ステータス バーで既定のメモリ設定を変更できます ( > [設定] > [詳細設定])。

cpus=4

コンテナに使用できる利用可能な CPU リソースの量を指定します。Docker ドキュメントでランタイム オプションに関する詳細を確認できます。

python:2.7

実行する Docker イメージ。bitbucket-pipeline.yml ファイルで指定したイメージを使用することが一般的です。詳細は、「Docker イメージをビルド環境として使用する」を参照してください。

--entrypoint=/bin/bash

bash プロンプトを開始します。

環境変数をコンテナに渡すには、-e スイッチを使用できます (例: -e "VAR1=hello" -e "VAR2=world" を上記のコマンドの -it の前に追加、または --env-file=env-vars.txt ファイルを使用)。詳細情報

Docker イメージが実行され、次のように ID を確認できるようになっているはずです。

root@1af123ef2211:/localDebugRepo

これは、ユーザーは作業ディレクトリ内にいて、コマンドの実行を開始できることを意味します。

ビルド サービスでのテスト

ビルドで MySQL などのサービスを標準的に使用する場合、別のコンテナを使用してこれをローカルでテストすることもできます。

サービスを使用するには、メイン コンテナの前にサービス コンテナを開始します。

MySQL の例:

1 2 3 4 5 6 docker run --name my-mysql-name \ -e MYSQL_DATABASE='pipelines' \ -e MYSQL_RANDOM_ROOT_PASSWORD='yes' \ -e MYSQL_USER='test_user' \ -e MYSQL_PASSWORD='test_user_password' \ -d mysql:<tag>

次に、メイン コンテナの実行中に、--link オプションを使用して、サービス コンテナにリンクします。

ステップ 3 のコマンドの例は次のようになります。

1 docker run -it --link my-mysql-name:mysql --volume=/Users/myUserName/code/localDebugRepo:/localDebugRepo --workdir="/localDebugRepo" --memory=4g --memory-swap=4g --memory-swappiness=0 --entrypoint=/bin/bash python:2.7

ステップ 4: ローカル環境でスクリプトをテストする

コンテナをビルドして実行したら、Pipelines スクリプトに一覧化したコマンドを実行できます。

ローカルでデバッグできる問題が見つかり、その修正を行った場合は、bitbucket-piplines.yml を更新して一致させます。

実際にこれを使用した場合の例を見てみましょう。

この段階で、オープンな python:2.7 コンテナがあり、ユーザーはリポジトリ ディレクトリ内にいます。

ここから、次のことが実行できます。

  • bitbucket-pipelines.yml の個々のコマンドを実行してテストする

  • コンテナ内のツールを構成する

このガイドの冒頭で触れた bitbucket-pipelines.yml ファイルをテストします。

bitbucket-pipelines.yml

1 2 3 4 5 6 7 8 9 10 # You can use a Docker image from Docker Hub or your own container # registry for your build environment. image: python:2.7 pipelines: default: - step: script: # Modify the commands below to build your repository. - python --version - python myScript.py

スクリプトの最初のステップは、python バージョンのテストです。

$ python --version

出力に問題はないようです。

Python 2.7.11

次に、python スクリプトを実行します。

$ python myScript.py

この例は、リポジトリに myScript.py スクリプトがある場合にのみ動作します。スクリプトには、上記で実行したバージョン コマンドが含まれます。

ここでも、出力にエラーは表示されていません。

Python 2.7.11

次に、コンテナ内で設定を行う場合があります。

$ pip install scipy

出力:

Collecting scipy

  Downloading scipy-0.17.1-cp27-cp27mu-manylinux1_x86_64.whl (39.5MB)

    100% |████████████████████████████████| 39.5MB 34kB/s

Installing collected packages: scipy

Successfully installed scipy-0.17.1

これが正常に実行されているため、これを bitbucket-pipelines.yml ファイルに追加して変更をコミットし、パイプラインをエラーなしで実行できることを確認できます。

bitbucket-pipelines.yml

1 2 3 4 5 6 7 8 9 10 11 # You can use a Docker image from Docker Hub or your own container # registry for your build environment. image: python:2.7 pipelines: default: - step: script: # Modify the commands below to build your repository. - python --version - python myScript.py - pip install scipy
最終更新日 2021年01月20日)
次でキャッシュ 9:00 PM on Oct 21, 2021 |

その他のヘルプ