一次情報は https://github.com/docker-library/postgres/issues/681 参照。
事象
PostgreSQL公式のdocker imageが2020-02-15 07:00 JST頃に更新され、(おそらく) 9.4以上すべてのlatest minor versionで、PostgreSQLが起動せずにexitすることがある。エラーメッセージは以下。
code:shell Error: Database is uninitialized and superuser password is not specified. You must specify POSTGRES_PASSWORD for the superuser. Use "-e POSTGRES_PASSWORD=password" to set it in "docker run". You may also use POSTGRES_HOST_AUTH_METHOD=trust to allow all connections without a password. This is *not* recommended. See PostgreSQL documentation about "trust": https://www.postgresql.org/docs/current/auth-trust.html Exited with code 1
このエラーメッセージは https://github.com/docker-library/postgres/blob/05ac2d3ba69fc62c7acf6f689d3a93e5e862f738/docker-entrypoint.sh#L112-L119 から来ている
発生条件
発生条件は以下のいずれかにあてはまる場合
POSTGRES_PASSWORD
に長さ1以上の文字列を設定していないPOSTGRES_HOST_AUTH_METHOD: "trust"
を設定していない
理由
セキュリティ向上のため。変更が入った https://github.com/docker-library/postgres/pull/658 に詳しい。password未設定の場合は誰でもアクセスできてしまうので、それを防ぐため。
MySQLのdocker imageはdefaultではpasswordが必須になっているのでそちらと合わせるとのこと。
対応
以下のいずれか。エラーメッセージにあるように公式の推奨は1。
POSTGRES_PASSWORD
に長さ1以上の文字列を設定する (空文字だと[ -z $POSTGRES_PASSWORD ]
で未設定と判断される)POSTGRES_HOST_AUTH_METHOD: "trust"
を設定する (MySQLでいうMYSQL_ALLOW_EMPTY_PASSWORD
に該当する)latest minor versionではなく過去のversionを指定する過去のversionのimmutable identifierを指定する
本番でこのimageを使い、かつpassword設定してない人はほとんどいないと思いますが、CIでPOSTGRES_PASSWORD
指定せずに立ち上げて落ちる人はそこそこいるのではないかと思います(というか僕も落ちたので気づいた)
postgres:9.6
のようにmajor versionまでしか指定してない場合、minor versionはpullするtimingで変わるので、まさに「何もしてないのに壊れた」ように見えそうです。
(2020-02-17 追記)
同僚の @mtsmfm さんから指摘いただいたので追記。
- docker image のありとあらゆるタグは上書きされる可能性があり、patch まで指定していても更新されることはよくあります
- なんでも上書きされる可能性があるのは git もそうなんですが、docker image はかなり雰囲気でどんどん更新されます
- 本当に厳密にやりたければ一応コミットハッシュみたいなので指定する方法があります https://docs.docker.com/engine/reference/commandline/pull/#pull-an-image-by-digest-immutable-identifier
(2020-02-17 追記おわり)