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

rub*_*bik 5 postgresql docker docker-compose

该的文档postgres泊坞窗图像有关的环境变量如下POSTGRES_DB

此可选的环境变量可用于为首次启动映像时创建的默认数据库定义其他名称。如果未指定,则将使用POSTGRES_USER的值。

我发现这根本不是真的。例如,使用此配置:

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
Run Code Online (Sandbox Code Playgroud)

默认数据库称为postgres,而不是customname我指定的数据库:

$ docker exec -it store psql -U custom customname
psql: FATAL:  database customname does not exist
$ docker exec -it store psql -U custom postgres
psql (11.3)
Type help for help.

postgres=# ^D
Run Code Online (Sandbox Code Playgroud)

我是否缺少明显的东西?

b0g*_*usb 20

像您一样提供环境变量,应该customname在容器初始化时创建数据库。无需在/docker-entrypoint-initdb.d/' init 脚本中创建用户名和数据库。

我会确保没有任何悬挂postgres_data量。如果您之前在未指定环境变量的情况下启动了容器,则会为默认postgres数据库创建卷。下次启动容器时(POSTGRES_DB指定 env),将跳过数据库创建部分。

只是为了确保,删除任何创建的卷(名称应该类似于*_postgres_data

docker volume ls
docker volume rm <volume_name>
Run Code Online (Sandbox Code Playgroud)

请参阅用户和数据库也不是从环境变量参数创建的。希望有帮助