Postgres Docker映像未使用自定义名称创建数据库

时间:2019-06-18 22:10:37

标签: postgresql docker docker-compose

有关环境变量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

我缺少明显的东西吗?

3 个答案:

答案 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>

然后再次运行撰写文件