gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:21:27 27 4
gpt4 key购买 nike

Docker PostgresQL docs里有一条消息:

Warning: the Docker specific variables will only have an effect if you start the container with a data directory that is empty; any pre-existing database will be left untouched on container startup.



所以当我用 docker-compose down 重新创建我的 postgres 容器时和 docker-compose up -d --remove-orphans ,它会引发我的错误,例如:

FATAL: password authentication failed for user "myuser"



这是因为 postgres 看到有卷,所以它跳过所有脚本和 .env 文件(我设置了 POSTGRES_USERPOSTGRES_PASSWORD )。

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

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

这是我的 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}

我的 .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"

最佳答案

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

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

$ cat .env
...
PGPASSWORD="somepwd"

否则,您可以 include a .pgpass file/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"

关于postgresql - 重新创建容器后如何让 PostgresQL 使用 .env 文件中的环境变量(不删除卷),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59390694/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com