Bitbucket Pipelines:「Container 'docker' exceeded memory limit.」
docker のサービス(ステップの docker build・docker run・pipe を受け持つ Docker デーモン)が、自分の分のメモリを使い切りました。書かなければ 1024 MB です。ステップを大きくしても、それだけでは増えません。bitbucket-pipelines.yml に docker のサービスのメモリを書きます。
size: 2x で直らないわけ
このメッセージについての Atlassian の記事(Bitbucket Pipeline build error "Container 'docker' exceeded memory limit")によると、docker のサービスは、多く割り当てるまでステップの大きさにかかわらず 1024 MB のままです。ステップを大きくして増えた分は、スクリプトが動くビルドのコンテナに回り、Docker には回りません。
この 1024 MB で、ステップの中の Docker の仕事を全部まかないます。docker run で起こしたコンテナ全部と、docker build に要るメモリです(Run Docker commands in Bitbucket Pipelines)。
docker のサービスにメモリを足す
definitions:
services:
docker:
memory: 3072
pipelines:
default:
- step:
services:
- docker
script:
- docker build -t my-image .
memory の単位はメガバイトです。docker のサービスには image は要りません(Pipelines が用意します)。
pipe のあるステップ
pipe は Docker のコンテナとして動くので、ステップに書いていなくても Pipelines が docker のサービスを足します。足されたサービスは 1024 MB のままです。書いた memory を効かせるには、そのステップに docker を自分で書きます:
- step:
services:
- docker
script:
- pipe: atlassian/git-secrets-scan:3.1.0
どこまで足せるか
docker のサービスに渡せるのは、ステップのメモリから、ビルドのコンテナの 1024 MB と、ほかのサービスの分を引いた残りです。ほかのサービスが無いとき、Atlassian の記事の数字:
| ステップの大きさ | ステップのメモリ | docker の上限 |
|---|---|---|
| 1x | 4096 MB | 3072 MB |
| 2x | 8192 MB | 7168 MB |
| 4x | 16384 MB | 15360 MB |
| 8x | 32768 MB | 31744 MB |
| 16x | 65536 MB | 63488 MB |
4x 以上は Standard と Premium のプランだけで、大きいほどその倍数だけビルド時間(build minutes)を使います(Step options)。
Docker に渡した分だけ、スクリプトの分が減ります。1x で memory: 3072 にすると、ビルドのコンテナに残るのは 1024 MB だけです。スクリプトもメモリを使うなら、今度は 「Container 'Build' exceeded memory limit.」で止まります。そのときは size: 2x にして、たとえば memory: 4096(スクリプトに 4096 MB 残る)にします。
ステップごとに違うメモリにする
docker の memory は、それを書いたステップ全部に効きます。1つのステップだけ多く要るなら、Atlassian の文書にあるとおり、type が docker の別のサービスを作ります:
definitions:
services:
docker:
memory: 1024
docker-large:
type: docker
memory: 7168
pipelines:
default:
- step:
name: Unit tests
services: [docker]
script:
- docker build -t my-tests -f Dockerfile.test .
- step:
name: Image
size: 2x
services: [docker-large]
script:
- docker build -t my-image .
コンテナを上限の中に収める
- 起こすコンテナに上限をかける:
docker run --memory 1G my-image、Compose ならdeploy.resources.limits.memory。JVM などは自分でメモリの使い方を決めます。上限があれば、1つのコンテナが Docker の分を全部取ることがありません。 Dockerfileの中で Gradle・Maven・Node を動かすビルドには、手元と同じ上限が要ります(-Xmx・--max-old-space-size)。options: docker: true(全部のステップに Docker)は古いファイルのために残されている書き方です。Atlassian は、使うステップにdockerを書くほうを勧めています。どちらでもサービスとして数えられます。
IntelliJ IDEA で Bitbucket Pipelines を見る
Pipeline Inbox for Bitbucket Pipelines は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。Bitbucket Cloud の全部のリポジトリのパイプラインを IDE のツールウィンドウに並べ、ステップ、失敗したステップと止まったコマンド、Bitbucket が書くそばから伸びるステップのログを見せます。一覧・ステップ・ログは無料。パイプラインの実行・やり直し・停止は Pro(月 US$1.50・30日の無料試用つき)。
Atlassian・Bitbucket・Bitbucket Pipelines は Atlassian の商標、Docker は Docker, Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは Atlassian・Docker・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:push したのに Pipelines が動かない · 「Container 'Build' exceeded memory limit.」 · 「Exceeded build time limit of 120 minutes」 · キャッシュが効かない · 「unexpected system error」 · 「command not found」 · サブモジュールを取ってこない · 「We couldn't clone the repository」 · 「No online runner available」 · 「No space left on device」 · 「Step exceeded processing limits」 · 次のステップにアーティファクトが無い · 前は通ったビルドが今は落ちる · Build setup に時間がかかる · ビルド時間を使い切った · 「Permission denied to update branch」 · 「You have reached your pull rate limit」(Docker Hub) · 「There is an error in your bitbucket-pipelines.yml」 · 「This pipeline was paused」(デプロイ) · IntelliJ IDEA の Bitbucket Pipelines 用プラグインの比較 · English