如何使 PostgresQL 在重新创建容器后使用 .env 文件中的环境变量(不删除卷)

Kli*_*mbo 7 postgresql environment-variables docker docker-compose

Docker PostgresQL 文档中有一条消息:

警告:只有当您使用空数据目录启动容器时,Docker 特定变量才会生效;容器启动时任何预先存在的数据库都将保持不变。

docker-compose down因此,当我使用and重新创建 postgres 容器时docker-compose up -d --remove-orphans,它会抛出如下错误:

致命:用户“myuser”的密码身份验证失败

发生这种情况是因为 postgres 看到存在该卷,因此它会跳过所有脚本和 .env 文件(我在其中设置POSTGRES_USERPOSTGRES_PASSWORD)。

如何解决这个问题?(我的意思是每次重新创建 postgres 容器时都从 .env 文件提供变量)

ps 我不可能删除旧卷,因为我那里有数据。

这是我的docker-compose.yml文件:

postgres:
    image: postgres:alpine
    restart: always
    expose:
      - 5432
    volumes:
      - "./init/postgres:/docker-entrypoint-initdb.d"
      - "./data/postgres_data:/var/lib/postgresql/data"
    environment:
      POSTGRES_DB:       ${POSTGRES_DB}
      POSTGRES_USER:     ${POSTGRES_USR}
      POSTGRES_PASSWORD: ${POSTGRES_PWD}
Run Code Online (Sandbox Code Playgroud)

我的 .env 文件:

# Postgres
export POSTGRES_USR="someuser"
export POSTGRES_PWD="somepwd"
export POSTGRES_DB="somedb"
export POSTGRES_URL="postgres://${POSTGRES_USR}:${POSTGRES_PWD}@postgres:5432/${POSTGRES_DB}?sslmode=disable"
Run Code Online (Sandbox Code Playgroud)

ric*_*yen 8

环境POSTGRES_*变量用于定义创建和连接数据库的方式。如果您有现有数据库,则需要定义PG*环境变量以便可以连接到它。

因此,您还应该包含PGPASSWORD在该.env文件中,以便为现有集群定义的密码将添加到环境中:

$ cat .env
...
PGPASSWORD="somepwd"
Run Code Online (Sandbox Code Playgroud)

否则,您可以将文件包含.pgpass/home/postgres

顺便说一句,该.env文件应该只是键值对的列表。你不需要export他们:

$ cat .env
POSTGRES_USER="someuser"
POSTGRES_PASSWORD="somepwd"
POSTGRES_DB="somedb"
POSTGRES_URL="postgres://${POSTGRES_USR}:${POSTGRES_PWD}@postgres:5432/${POSTGRES_DB}?sslmode=disable"
Run Code Online (Sandbox Code Playgroud)