Docker Compose の 429 エラー:原因と解決策
冒頭まとめ docker compose の実行中に現れる 429 Too Many Requests は、ほぼ例外なく Docker Hub の pull 回数制限です。制限そのものの仕組み(匿名は IP 単位、認証済みはアカウント単位)は Compose に固有の話ではありません(Docker の 429 の記事)。 Compose に固有なのは、同じ作業でも要求の回数と同時実行数が増えやすいという点です。増幅の要因は3つあります。 1つ目は並列度です。公式のリファレンスによれば、--parallel の既定値は -1、つまり無制限です。15 サービスの構成なら、15 件の取得要求がほぼ同時に飛びます。 2つ目はタグです。公式文書には、既定の missing という方針であっても latest タグだけは常に取得される、と明記されています。実装を読むと、手元にイメージがあるかを判定する関数が、タグが latest のときは「無い」と扱う作りになっています。image: nginx のようにタグを省略した記述は latest を指すため、up のたびにレジストリへ問い合わせが行きます。 3つ目は取得方針です。pull_policy: always や docker compose up --pull always を使っていると、手元にあっても毎回取得します。 さらに、Compose の取得処理には再試行の仕組みがありません。制限に当たれば、その場で失敗します。 したがって対処の順序は、上限を増やすことではなく、この3つの増幅要因を減らすことから始まります。 エラーの概要 docker compose pull や docker compose up の実行中に、次の形で現れます。 [+] Pulling 3/5 ✔ redis Pulled ✘ web Error toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: ... ✘ api Error toomanyrequests: You have reached your pull rate limit. Error response from daemon: toomanyrequests: You have reached your pull rate limit. 注目すべきは、複数のサービスが同時に失敗する点です。単発の docker pull なら1件で終わるところが、並列に走っているため、残り枠を一気に使い切ってまとめて弾かれます。 ...