【Docker】「max depth exceeded」エラーについて考える

開発環境構築にDockerを使っているのですが、急にDockerのイメージが作れない現象に遭遇しました。 docker-compose buildを実行すると次のエラーが帰ってきます。

Service 'db' failed to build: max depth exceeded
(サービス 'db'のビルドに失敗しました:最大深度を超えました)

ちなみに、dbと言うのは、MySQLのイメージから作ったコンテナのことです。

イントロダクション

この記事で得られること

  • max depth exceededの解消方法がわかる。

環境

項目 バージョン
docker 18.03.1-ce-mac65

注意

今回は、正確な原因究明までに至っていません。
最終的な解決策や、エラーが起きた時の状況をまとめた記事です。
ご了承ください。

解決方法

結論から言うと、dbコンテナとMySQLのイメージを削除しました。

docker ps -adocker imagesを駆使して親子関連を探し、関連しているイメージとコンテナをひたすら消す作業をしました。
全て消した状態で改めてdocker-compose buildを実行すると、新しくコンテナが作れます。

原因の考察

中間レイヤーには上限があると思われます。

docker build、及び、docker-compose buildでコンテナを作ると、dockerfileの処理を中間レイヤーという単位でキャッシュします。
この中間レイヤーがあるので、2回目以降のビルドも不必要に処理をしません。

しかし、今の今まで特に中間レイヤーの管理をしてこなかったので、キャッシュの解放ができずオーバーフローをしてしまったのだと考えられます。

中間レイヤーと言うのは、あくまでネット上で取り上げられている名前で、公式の言い方では無いかもしれません。

キャッシュを保持できる上限がどこで設定されているかは調査できていませんが、私の場合は200件近いキャッシュが残っていました。

参考

未解決の状態で、コンテナを確認すると次のような情報が得られます。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
f8ebd1b437de        fa721c8cb317        "docker-entrypoint.s…"   27 minutes ago      Created                                 hopeful_mcnulty
0274d3a2f4d6        fa721c8cb317        "docker-entrypoint.s…"   31 minutes ago      Created                                 stoic_spence
3b89a4f931ae        fa721c8cb317        "docker-entrypoint.s…"   36 minutes ago      Created                                 quirky_mclean
ef7b2ab8afa6        fa721c8cb317        "docker-entrypoint.s…"   8 hours ago         Created                                 fervent_mclean
34710ad15e02        fa721c8cb317        "docker-entrypoint.s…"   8 hours ago         Created                                 distracted_hopper
2e1f3e23dae2        fa721c8cb317        "docker-entrypoint.s…"   8 hours ago         Created                                 suspicious_jennings
4b58c524cd63        fa721c8cb317        "docker-entrypoint.s…"   9 hours ago         Created                                 trusting_bartik
5facdda63d00        fa721c8cb317        "docker-entrypoint.s…"   9 hours ago         Created                                 eloquent_kowalevski
b94160121d6c        fa721c8cb317        "docker-entrypoint.s…"   9 hours ago         Created                                 sad_banach

このイメージfa721c8cb317に親に当たるイメージはmysqlの公式イメージです。

$ docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
mysql                 latest              fa721c8cb317        10 hours ago        371MB
#省略

実際に、mysqlのイメージを削除すると、キャッシュと思われる情報が一斉に消えていきます。

$ docker rmi fa721c8cb317
Untagged: mysql:latest
Deleted: sha256:****************************
Deleted: sha256:****************************
Deleted: sha256:****************************
...
# 200件近い数

全て消えた状態で、docker-compose buildを実行すると問題なくコンテナを作れます。