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

Builds the container with a 1GB of memory and no swap space (swap is calculated by swap value - memory value). This memory amount simulates the memory restrictions in Pipelines for a service container (both flags are needed). 

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

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

macOS (OS X)

Use the docker stats command to check the actual memory limit of the container.

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

-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

Mounts the local directory called /Users/myUserName/code/localDebugRepo inside the container as /localDebugRepo.

注意

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

詳細を表示

The command runs with a default setting, which grants the container read and write permissions to the repository. You can limit the access to the local directory to read only by adding :ro at the end of the command:

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

--workdir="/localDebugRepo"

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

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

Runs the container with 4 GB of memory and no swap space, which simulates the memory restrictions in Pipelines for a build container (all 3 flags are needed).

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

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

macOS (OS X)

Use the docker stats command to check the actual memory limit of the container.

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

python: 2.7

The Docker image that you want to run. You probably want to use the image that you specified in your bitbucket-pipeline.yml file. For more information, see Use Docker images as build environments.

--entrypoint=/bin/bash

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

If you need to pass environment variables into your container you can use the -e switch, for example adding -e "VAR1=hello" -e "VAR2=world" to the above command before -it, or use a file --env-file=env-vars.txt. Learn more.


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>


Then, when you are running your main container, make sure to link it to the service container, using the --link option.

ステップ 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 を更新して一致させます。

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

At this stage, we have a python:2.7 container open and we're inside the repository directory.

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

  • run individual commands from the bitbucket-pipelines.yml to test them

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

We'll be testing the bitbucket-pipelines.yml file that we mentioned at the beginning of this guide.

もう一度ファイルを見る
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


As this runs well, we can add it to our bitbucket-pipelines.yml file and commit the changes, confident that the pipeline will run error free.

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 年 1 月 24 日

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

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