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

标签 postgresql docker docker-compose environment-variables

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/

相关文章:

docker - 如何在 Heroku 上使用多个 docker 容器?

hadoop - hadoop + hbase 设置的 docker-compose 问题

docker - 如何使用像https://localhost:5001/api/Movies/getname这样的api简单地在.net核心中从container1到container2调用方法

docker - 在没有 docker-compose.yml 文件的情况下杀死 docker-compose 容器

multithreading - JDBC:我可以在多线程应用程序中共享连接并享受良好的交易吗?

sql - 大型 PostgreSQL 表 : better to add a column or create a new table to store metadata?

docker-compose 镜像导出和导入

python - SQLAlchemy 连接丢失

postgresql - 有没有办法让 Postgres 提交超时?

arrays - 将 varchar 数据类型转换为 text[] 数组