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

お困りですか?

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

コミュニティに質問

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

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

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


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

はじめる前に

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

リポジトリのクローン方法について

要約:

$ cd /Users/myUserName/code

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

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


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

# 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


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


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

インストール手順は、使用するオペレーティング システムによっいぇ異なります。Docker が提供している次のインストール ガイドラインに従ってください。 https://docs.docker.com/engine/installation/

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

$ docker -v

SSH をインストール済みの場合、コマンドはバージョンの詳細情報を返し、適切にインストールされていることを示します。


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 イメージのビルドを行うことを指定します。


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

ステップ 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 --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"

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

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

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

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

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

macOS (OS X)

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

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

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 の例:

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 のコマンドの例は次のようになります。

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
# 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
# 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
最終更新日 2019 年 8 月 22 日

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

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