【问题标题】:Postgres Docker image is not creating database with custom namePostgres Docker 映像未使用自定义名称创建数据库
【发布时间】:2019-06-18 22:10:37
【问题描述】:

postgresDocker imagesays的文档如下关于env varPOSTGRES_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

默认数据库名为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

我是否遗漏了一些明显的东西?

【问题讨论】:

    标签: postgresql docker docker-compose


    【解决方案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】:

    您需要先创建数据库。

    如果您想为新的数据目录自动执行此操作,那么官方 Docker Postgres 映像可以通过将带有扩展名 .sqlInitialization Scripts 放在 /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,例如在Dockerfile 中使用COPY。该目录中扩展名为.sql的脚本只有在DATA目录为空时才会运行,并且多个文件将按照文件名的字母顺序运行。

    如果您想手动设置,也可以使用 createdb utility 进行设置

    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 数据库。

    【讨论】:

    • 文档的措辞让我觉得数据库会自动创建。不过,我需要一些方法在撰写管道期间创建它。
    • 实际上我再次阅读了文档,上面写着“第一次启动图像时创建的数据库”。所以看起来它肯定应该自动创建它。
    • 在将该环境变量添加到 docker-compose 之前,您之前是否在该卷上创建了一个集群?如果集群已经存在,我认为它不会创建一个新的数据库。
    • @rubik - 好的,我更了解你现在想要做什么。我更新了答案。
    【解决方案3】:

    如果您在第一次运行后更改了用户名/密码,请尝试删除之前创建的卷

        docker volume rm <volume-name>
    

    然后再次运行撰写文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-10
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 2019-06-21
      相关资源
      最近更新 更多