必須パッケージが古いことがわかっている場合は、ベースイメージのメンテナーに連絡した上で、アップデートするみたいなのがベストプラクティスってなっていたけど最近は上記の記事で言っているように違うらしい
hadolintで検証
検証用Dockerfile
FROM debian:9 RUN apt-get update && apt-get upgrade
古いやつ
$ hadolint --version Haskell Dockerfile Linter 1.18.2-no-git $ hadolint Dockerfile Dockerfile:3 DL3005 Do not use apt-get upgrade or dist-upgrade Dockerfile:3 DL3009 Delete the apt-get lists after installing something
最新。確かにアップデートは使うなという警告は無くなっている
$ docker container run -it hadolint/hadolint hadolint --version Haskell Dockerfile Linter v2.3.0-0-g96e61f8 $ docker container run -i hadolint/hadolint < Dockerfile -:3 DL3009 info: Delete the apt-get lists after installing something
ルールについての説明もリポジトリを見にくと確かに変わっているのがわかる。
ベースイメージでユーザが切り替わっている場合は再度スイッチしてrootでアップグレードした上でユーザを切り替えよう的な感じらしい。
そもそもディストロはいるのか
最近というか昔から言われているのがディストロ不要説。セキュリティ的にパッケージアップデートが必要なのは理解できるがそもそもセキュリティホールになるようなパッケージなりバイナリなりをおく必要があるのかという話。デバッグ用途でそれなりのコマンドを入れておくのは良さそうだけど本番運用するならいらないのかもしれない。