valid,invalid

関心を持てる事柄について

PostgreSQL docker imageがPOSTGRES_PASSWORD未設定だと起動しない

一次情報は 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。

  1. POSTGRES_PASSWORD に長さ1以上の文字列を設定する (空文字だと [ -z $POSTGRES_PASSWORD ] で未設定と判断される)
  2. POSTGRES_HOST_AUTH_METHOD: "trust"を設定する (MySQLでいう MYSQL_ALLOW_EMPTY_PASSWORD に該当する)
  3. 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 追記おわり)