[英]How to pass environment variables to a sql file from bash shell (PostgreSQL)
[英]How to make PostgresQL use environment variables from .env file after re-creating the container (without removing the volume)
Docker PostgresQL 文檔中有一條消息:
警告:Docker 特定變量僅在您使用空數據目錄啟動容器時才有效; 在容器啟動時,任何預先存在的數據庫都將保持不變。
因此,當我使用docker-compose down
和docker-compose up -d --remove-orphans
重新創建我的 postgres 容器時,它會引發如下錯誤:
致命:用戶“myuser”的密碼驗證失敗
發生這種情況是因為 postgres 看到有卷,所以它跳過所有腳本和 .env 文件(我在其中設置POSTGRES_USER
和POSTGRES_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.