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_USER
和 POSTGRES_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/