有关环境变量postgres
的{{1}} Docker映像says的文档:
此可选环境变量可用于为首次启动映像时创建的默认数据库定义其他名称。如果未指定,则将使用POSTGRES_USER的值。
我发现事实并非如此。例如,使用以下配置:
POSTGRES_DB
默认数据库名为version: '3.7'
services:
db:
image: postgres:11.3-alpine
restart: always
container_name: store
volumes:
- postgres_data:/var/lib/postgresql/data/
ports:
- 5432:5432
environment:
- POSTGRES_USER=custom
- POSTGRES_DB=customname
- POSTGRES_PASSWORD_FILE=/run/secrets/db_password
secrets:
- db_password
volumes:
postgres_data:
secrets:
db_password:
file: config/.secrets.db_password
,而不是我指定的postgres
:
customname
我缺少明显的东西吗?
答案 0 :(得分:1)
您需要首先创建数据库。
如果要对新数据目录自动执行此操作,则可以在Docker Postgres官方映像中将扩展名为.sql
的{{3}}放置在/docker-entrypoint-initdb.d/
目录中来进行选择。 。
例如,创建一个内容如下的文件:
CREATE USER custom_user;
CREATE DATABASE custom_db;
GRANT ALL PRIVILEGES ON DATABASE custom_db TO custom_user;
并将其保存到容器中的/docker-entrypoint-initdb.d/create-db.sql
,例如COPY
中的Dockerfile
。仅当DATA目录为空时,该目录中扩展名为.sql
的脚本才会运行,并且多个文件将按照文件名的字母顺序运行。
如果要手动设置,也可以使用Initialization Scripts
createdb [connection-option...] [option...] [dbname [description]]
或者通过连接到postgres
数据库并使用CREATE DATABASE ...
命令,例如
docker exec -it store psql -U postgres -c 'CREATE DATABASE customname;'
如果按照问题进行交互式连接,则可以执行以下操作:
$ docker exec -it store psql -U postgres
psql (11.3)
Type help for help.
postgres=# CREATE DATABASE customname;
CREATE DATABASE
postgres=# \c customname
最后一条命令会将您连接到customname
数据库。
答案 1 :(得分:1)
像您一样提供环境变量,应该在初始化容器时创建customname
数据库。无需在/docker-entrypoint-initdb.d/
'初始化脚本中创建用户名和数据库。
我将确保没有postgres_data
个挂起的卷。如果您以前没有指定环境变量就启动了容器,则将为默认的postgres
数据库创建该卷。下次启动容器时(指定了POSTGRES_DB
env),将跳过数据库创建部分。
请确保删除所有创建的卷(名称应类似于*_postgres_data
)
docker volume ls
docker volume rm <volume_name>
也请参见User and DB were not created from environment variable arguments。希望有帮助
答案 2 :(得分:0)
如果自首次运行以来已更改了用户名/密码,请尝试删除先前创建的卷
docker volume rm <volume-name>
然后再次运行撰写文件