簡體   English   中英

重新創建容器后如何讓 PostgresQL 使用 .env 文件中的環境變量(不刪除卷)

[英]How to make PostgresQL use environment variables from .env file after re-creating the container (without removing the volume)

Docker PostgresQL 文檔中有一條消息:

警告:Docker 特定變量僅在您使用空數據目錄啟動容器時才有效; 在容器啟動時,任何預先存在的數據庫都將保持不變。

因此,當我使用docker-compose downdocker-compose up -d --remove-orphans重新創建我的 postgres 容器時,它會引發如下錯誤:

致命:用戶“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}

我的 .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_*環境變量用於定義創建和連接數據庫的方式。 如果您有一個現有的數據庫,則需要定義PG*環境變量,以便您可以連接到它。

因此,您還應該在.env文件中包含PGPASSWORD ,以便將您為現有集群定義的密碼添加到環境中:

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

否則,您可以在/home/postgres包含一個.pgpass文件

順便說一句, .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"

在我的問題中,我從.env文件中的 Postgres 配置中刪除了" ,這解決了我的問題

POSTGRES_USR=someuser
POSTGRES_PWD=somepwd
POSTGRES_DB=somedb

並在 docker-compose 文件中

environment:
  POSTGRES_DB:       ${POSTGRES_DB}
  POSTGRES_USER:     ${POSTGRES_USR}
  POSTGRES_PASSWORD: ${POSTGRES_PWD}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM