動かざることバグの如し

近づきたいよ 君の理想に

Dockerでapt-update含むビルドエラーになってしまった謎

環境

  • Docker 26.0.0

症状

Dockerでビルドに失敗する。よく見ると apt update に失敗する。そんなことある?????

Reading package lists...
E: Problem executing scripts APT::Update::Post-Invoke 'rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true'
E: Sub-process returned an error code

調べたらそんなことあった

確認方法

以下実行するとエラー

$ docker run --rm debian:bookworm apt-get update
Unable to find image 'debian:bookworm' locally
bookworm: Pulling from library/debian
71215d55680c: Pull complete
Digest: sha256:e97ee92bf1e11a2de654e9f3da827d8dce32b54e0490ac83bfc65c8706568116
Status: Downloaded newer image for debian:bookworm
Get:1 http://deb.debian.org/debian bookworm InRelease [151 kB]
Get:2 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
Get:3 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
Get:4 http://deb.debian.org/debian bookworm/main amd64 Packages [8786 kB]
Get:5 http://deb.debian.org/debian bookworm-updates/main amd64 Packages [12.7 kB]
Get:6 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [147 kB]
Fetched 9201 kB in 2s (5312 kB/s)
Reading package lists...
E: Problem executing scripts APT::Update::Post-Invoke 'rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true'
E: Sub-process returned an error code

--security-opt seccomp=unconfined つけると成功する

$ docker run --rm --security-opt seccomp=unconfined debian:bookworm apt-get update
Get:1 http://deb.debian.org/debian bookworm InRelease [151 kB]
Get:2 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
Get:3 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
Get:4 http://deb.debian.org/debian bookworm/main amd64 Packages [8786 kB]
Get:5 http://deb.debian.org/debian bookworm-updates/main amd64 Packages [12.7 kB]
Get:6 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [147 kB]
Fetched 9201 kB in 1s (6239 kB/s)
Reading package lists...

原因

この問題の原因は、Dockerのセキュリティ機能であるseccomp(Secure Computing Mode)のデフォルトポリシーに関連している。

seccompは、コンテナ内のプロセスが実行できるシステムコールを制限することで、セキュリティを強化する機能である。この機能により、悪意のあるプログラムがホストシステムに影響を与えるリスクを軽減する。

エラーメッセージにあるE: Problem executing scripts...は、apt-get updateの実行後に設定されたPost-Invokeスクリプトが正常に実行できないことを示している。

このスクリプトは、APTキャッシュをクリーンアップするためにrmコマンドを使用しているが、seccompのデフォルトポリシーによってこの操作が制限されている可能性がある。

--security-opt seccomp=unconfinedオプションを付けてDockerコンテナを実行すると成功する理由は、このオプションがseccompセキュリティポリシーを無効にし、コンテナ内のプロセスが実行できるシステムコールに制限を設けなくなるためである。その結果、apt-get updateの実行中にPost-Invokeスクリプトが正常に実行され、エラーが発生しなくなる。

対象のサーバーがseccomp有効かチェックするコマンドは以下

$ docker system info --format '{{json .SecurityOptions}}'
["name=apparmor","name=seccomp,profile=default"]

対策

  • ホスト側の「libseccomp2」パッケージを最新にする
  • docker runの場合は「--security-opt seccomp=unconfined」でseccomp回避可能(セキュリティ的に脆弱になる
    • docker buildには使えない
  • Dockerイメージをbookwormからbullseyeベースに戻す
    • 応急処置としてはアリ

参考リンク