Linux Docker 用のランナーをセットアップする

ランナーを使用すると、独自のインフラストラクチャ上の Pipelines でビルドを実行でき、自社ホストのランナーで使用するビルド時間に対して課金されなくなります。

前提条件

  • ランナー用のホストとして少なくとも 8GB の RAM を持つ 64 ビット Linux インスタンス。

    • 2 つ以上のステップまたはビルド サービスによるビルドでは、より多くの RAM が必要になる場合があります。

  • ランナー コンテナーには少なくとも 512MB のメモリを割り当てます。

  • Docker v19.03 以上 - Docker をインストールする

 


べスト プラクティス

スワップを無効化して vm.swappiness を設定することを強くお勧めします。スワップを有効化すると、メモリと OOM に関して決定的でないビルドが生じる可能性があります。つまり、十分なスワップが利用可能であればビルドが渡されますが、十分なスワップが利用できないと同じビルドで OOM が生じることがあります。

Linux 環境でスワップを無効にする

ほとんどの Linux ディストリビューションでスワップを無効にする手順を次に示します。次のコマンドがインストールされていない場合は、それらをインストールする必要があります。スワップを設定する場合は、ディストリビューションのドキュメントをご参照ください。

  1. スワップが有効になっているかどうかを確認するには、次のコマンドを使用します。

    1 sudo swapon -sv

    スワップが有効な場合は、次のような出力が表示されます。

    1 2 NAME TYPE SIZE USED PRIO /dev/sda3 partition 2G 655.2M -1
  2. スワップが有効な場合は、次のプロセスを使用して無効にする必要があります。

    1. 次のコマンドを実行して、すべてのスワップを無効にします。

      1 sudo swapoff -av
    2. /etc/fstab を開いて、構成されているすべてのスワップ パーティションまたはファイルを削除します。

    3. マシンを再起動します。

    4. 次のコマンドをもう一度実行して、次の出力がないことを確認します。

      1 sudo swapoff -av
    5. 出力がある場合はステップ 2 を繰り返して、すべてのスワップ ファイルが /etc/fstab から削除されていることを確認します。

Linux 環境で vm.swappiness を構成する

ほとんどの Linux ディストリビューションで vm.swappiness を構成する手順を次に示します。次のコマンドがインストールされていない場合は、それらをインストールする必要があります。スワップを設定する場合は、ディストリビューションのドキュメントをご参照ください。

  1. vm.swappiness の値を確認するには、次のコマンドを使用します。

    1 sudo sysctl -n vm.swappiness

    値が 1 以外の場合は、スワップ動作がまだ有効になっていることを意味します。

  2. swappiness の値が 1 以外の値である場合は、次のプロセスで設定します。

    1. /etc/sysctl.conf を開いて、vm.swappiness = 1 をファイル自体の行に追加します。

    2. マシンを再起動します。

    3. 次のコマンドを実行して、出力が 1 になることを確認します。

      1 sudo sysctl -n vm.swappiness
    4. 1 以外の出力がある場合は、ステップ 2 を繰り返して、/etc/sysctl.conf が正しく構成されていることを確認します。

Docker イメージのクリーン アップをスケジュールする

ディスク スペースが不足しないように、Docker イメージを自動で削除するプロセスを設定することをお勧めします。docker system prune -af コマンドを使用して cron ジョブを作成し、すべての未使用のイメージを削除できます。スケジュールは、使用するイメージのサイズ、利用可能なディスク スペース、ランナーでビルドを実行する頻度によって異なります。

たとえば、週に 1 回、日曜日の午前 0 時にイメージをクリーン アップするには、次の手順に従います。

  1. crontab -e コマンドを使用して、ユーザー アカウントの crontab ファイルを開きます。

  2. 次のエントリを追加します。0 0 * * 0 docker system prune -af

  3. ファイルを保存して閉じます。

詳細については、crontab のドキュメントをご確認ください。


ランナーを始める

  1. ランナー ページに移動します。

    • ワークスペース ランナーについては、[ワークスペース設定] > [ワークスペース ランナー] の順に移動してご確認ください。

    • リポジトリ ランナーについては、[リポジトリ設定] > [ランナー] の順に移動してご確認ください。

  2. [ランナーを追加] を選択します。

  3. [ランナー インストール] ダイアログの [システムとアーキテクチャ] で、Linux Docker (x86_64) または Linux Docker (arm64) を選択します。

  4. [ランナー インストール] ダイアログの実行ステップで提供される事前設定された Docker コマンドによって、ランナーを実行します。

    • ランナー実行が 1 回目の場合は、イメージをプルします。

    • ランナーを再開する、またはランナーを更新する場合は、次のコマンドを使用する前にランナーを手動でプルして、常に最新のランナーを実行するようにしてください。

      1 docker image pull docker-public.packages.atlassian.com/sox/atlassian/bitbucket-pipelines-runner:1
    • 次のエラーが発生した場合は、以下の「docker container rm -f runner」コマンドを実行してランナーを削除します。
      エラー

      1 2 docker: Error response from daemon: docker: Error response from daemon: Conflict. The container name "/runner-76b247e7-b925-5e7b-9da2-1cda14c4ff2c" is already in use by container "c3403236e3af5962ed3a9b8771561bd2021974941cc8a89a40c6c66cecb18f53". You have to remove (or rename) that container to be able to reuse that name. See 'docker run --help'.

      docker container rm -f runner コマンド

      1 docker container rm -f runner-76b247e7-b925-5e7b-9da2-1cda14c4ff2c

ランナーの作業ディレクトリを変更する

ランナーがホスト マシンで使用する作業ディレクトリを変更する場合は、ランナーを起動するときに docker run コマンドに次の 2 つのフラグを追加します。

1 docker run [all existing parameters] -v /mydir:/mydir -e WORKING_DIRECTORY=/mydir

このコマンドでは、-v パラメーターの最初の値は、作業ディレクトリとして機能するマシン上のローカル ディレクトリになります。2 番目の値は、ランナー内のディレクトリになります。WORKING_DIRECTORY 環境変数で指定された値と一致するものであれば、どのようなものでも構いません。

作業ディレクトリはランナーのログが永続的に格納されますが、ステップの実行中に一時ファイルを保存するためにも使用されます。

ホスト デバイス上のファイルにアクセスする

Docker ランタイムでは、ローカル ファイルにアクセスできません。既定では、ランナーはホストへのアクセスを制限します。これは、ランナーの存在するすべてのマシンにあるとは限らないファイルへの依存関係によって発生するパイプラインの障害を回避するためです。

回避策として、次のコマンドを実行して、ランナーのビルドから SFTP クライアントを使用してホスト上のファイルにアクセスすることをお勧めします。

1 sftp {user}@{host}:{remoteFileName} {localFileName}

OpenSSH の sftp コマンドの使用方法については、OpenBSD マニュアル ページ サーバーの sftp をご覧ください。

安全ではない Docker レジストリのイメージの使用

Linux Docker ランナー上の安全でない Docker レジストリのイメージを使用するには、カスタム docker-in-docker サービスを使用します。例:
dockerfile

1 2 3 # my-custom-dind-image FROM docker:dind ENTRYPOINT [ "sh", "-c", "dockerd-entrypoint.sh $DOCKER_OPTS" ]

bitbucket-pipelines.yml

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 definitions: services: docker: image: my-custom-dind-image variables: DOCKER_OPTS: "--insecure-registry=my.docker.registry" pipelines: default: - step: runs-on: self.hosted services: - docker script: - docker build -t my.docker.registry/$IMAGE_NAME . - docker push my.docker.registry/$IMAGE_NAME

 

その他のヘルプ