😇

ある日突然DockerがBuildできなくなったときはDockerDesktopのバージョンを疑ってみてもいいかもしれない

2022/11/08に公開

結論から

  • タイトルの通りです。
  • Dockerがビルドできなくなったけど、DockerDesktopを4.13.1にアップデートしたら解決した。
  • (多分)DockerDesktopを4.13.0のamd64のエミュレートに問題があった。

という体験の記録になります。
特に記録を残す予定がなかったのでターミナルのログなどはほぼありませんがご了承ください。

想定読者

  • Dockerを使用している(記事はdocker-composeの使用前提のコマンドとなっています)
  • 突然Dockerがビルドできなくなったけど解決策がわからない

筆者自身がDockerにもLinuxにも明るくなく、途方に暮れたけどアップデートが解決してくれたよ、というだけの記事なので、LinuxやDockerに詳しい方は得るものがない記事となります。
また、結論がすべてなので、それだけわかればいい方もあとは蛇足な記事となります。

環境

MacBook Pro (13-inch, M1, 2020)
Docker Desktop 4.13.0

何が起きたか

M1チップのMacを使用しているとデフォルトではARMプロセッサのイメージをpullしてくるのですが、中にはARMプロセッサに対応していないイメージなども存在します。
そんなときは明示的にplatformを指定してbuildすることでM1チップでもARMプロセッサに対応していないイメージを使用することが可能となります。

この辺りの話についてはこちらの記事などがとても参考になります。
https://qiita.com/ktnyt/items/cefcb424a75f536f8422
https://zenn.dev/chimerast/articles/efae877853e837

長い前置きとなってしまいましたが、本題です。
動作検証で

 docker-compose build --no-cache app

を繰り返していたのですが、ある日突然buildで失敗するようになってしまったのです。
何もしてないのに壊れた😂
Dockerfileは触っていたのですが元に戻してもだめ、毎回落ちるところが変わる、エラーを見るとだいたい
 E: Sub-process /usr/bin/dpkg received a segmentation fault.
というエラーの痕跡がある。

他のイメージも試しにビルドしたところ、どうやら
platform: linux/amd64 を指定しているイメージがビルドできなくなっているようだ(全てではなさそうだし何回か頑張ればうまくいくのもある)
ということがわかりました。

試したこと

何もしてないと思ったけど、Dockerはアップデートしたな(4.12.x -> 4.13.0)、と思い至り、ARMプロセッサに対応してるイメージについてはplatformの指定をやめてビルドして成功することは確認しました。
これはやはりプロセッサの問題で、何らかの原因でM1でplatformを指定しただけではビルドできなくなってしまっており、Dockerfileをがっつり書き換えなくてはいけないのでは、という失意のもとその日を終えました。
platformを指定したり外したりして

 docker-compose build --no-cache app

をただただ繰り返し、何も解決しないまま時間だけが溶けました。

そしてアップデートへ

翌日になってDockerDesktopにアップデートの通知が来ていました。
バージョンは4.13.1
これはもしかしてと思ってアップデートした結果、昨日ビルドできなかったイメージがすべてビルドできるようになり、すべて元通りになりました。
めでたしめでたし。
という話なのですが、何が起きてたのか知りたくなったので、どんなアップデートだったのか見てみました。

https://docs.docker.com/desktop/release-notes/

  • docker pull 中に Control+C とか CMD+Cで中断したときにSegmentation Faultが起きるかもしれないのを修正した
    関係なさそう。
  • Qeum6.2に戻し、AMD64プロセッサにエミュレートしているときにPR_SET_CHILD_SUBREAPERが利用できないエラーを解消した(4.13.0はQeum7)
     多分これだったのではないかと思います。
    というのも、Qeumがプロセッサエミュレータであり、まさにAMD64のビルドで発生していたことからの予想です。PR_SET_CHILD_SUBREAPERが何をするものなのかは私では理解できなかったため、はっきりと特定できないのですが、非常に怪しいと思います。
  • https://github.com/docker/for-mac/issues/6529
    この辺もアーキテクチャ指定周りの修正が入っているので怪しい気もする。

どちらだったとしても
Docker Desktop 4.13.0
で問題が起きていたのだろうと納得できる修正内容のように思えました。

最後に

最近だとM1チップでもx86でイメージをビルドしなくてはいけないシーンも減ってきたのかな?とは思うので、現象自体がニッチな可能性はありますが、まだまだM1 Mac由来でDocker関連でつまづくシーンも多いのかなと思います。(記事中でもM1だから、と印象付ける記述をしてますが、今回の件にM1関係あったのかは謎)
Dockerfileを触ってなくても突然ビルドできなくなったときはDockerDesktopなど、Docker環境のバージョンを疑ってみるのも解決の糸口になるかもしれません。
今回はアップデートの通知で気がついて解決しましたが、それまでは動いていたなら時にはバージョンを下げる、という選択もあるのかもしれないです。

今回初めての記事を書きました。
なんのイメージをビルドしてたのか、どんなエラーだったのか、あまり情報を残していなかったため、経緯がわかりにくくなってしまったことご容赦ください。
追加で検証して再現確認できたら追記していきたいと思いますが、直近のアップデートによる影響の可能性を鑑みてゆるい情報共有として記事を書いてみました。
困っているどなたかの助けになれば幸いです。

Discussion