環境
症状
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イメージをbookwormからbullseyeベースに戻す
参考リンク