【问题标题】:docker-compose and create db in Postgres on initdocker-compose 并在初始化时在 Postgres 中创建数据库
【发布时间】:2020-01-13 11:20:17
【问题描述】:

我有一个问题。我对 docker 很陌生,所以我想做的是创建一个 docker-compose 文件,在 compose 命令上也将创建数据库。问题是它不会像我很好地问它那样创建数据库。所以我的 docker-compose 看起来像:

version: '3'

services:
  db:
    image: postgres:latest
    restart: always
    ports:
      - 5432:5432
    environment:
      POSTGRES_PASSWORD: 'postgres'
    volumes:
      - database_data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql

volumes:
  database_data:
    driver: local

当我在日志中启动 docker-compose up 时,我可以看到

db_1  | PostgreSQL Database directory appears to contain a database; Skipping initialization
db_1  |
db_1  | 2020-01-13 11:14:36.259 UTC [1] LOG:  starting PostgreSQL 12.1 (Debian 12.1-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
db_1  | 2020-01-13 11:14:36.259 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
db_1  | 2020-01-13 11:14:36.260 UTC [1] LOG:  listening on IPv6 address "::", port 5432
db_1  | 2020-01-13 11:14:36.264 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_1  | 2020-01-13 11:14:36.277 UTC [29] LOG:  database system was shut down at 2020-01-13 11:10:57 UTC
db_1  | 2020-01-13 11:14:36.280 UTC [1] LOG:  database system is ready to accept connections

在我的初始化 SQL 中只有 1 行:

CREATE DATABASE "MyDataBase";

当我列出 DB 是 Postgres 容器时,我的 DB 无处可寻。这个问题的根源可能是什么?

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    如果,当您启动 Docker Compose 时,您会得到:

    PostgreSQL Database directory appears to contain a database; Skipping initialization
    

    您需要主动删除为存储数据库而设置的卷。

    docker-compose down 命令不会自动执行此操作。

    您可以像这样请求删除卷:

    docker-compose down --volumes
    

    【讨论】:

    • 哦。这绝对可以节省时间 - 花时间调试没有被拾取的 POSTGRES_USER env var,谢谢!
    • 这会破坏数据吗?如果我想添加一个新数据库并保留现有数据库怎么办?
    【解决方案2】:

    根据documentation of postgres docker image,您所做的一切都是正确的。

    如果您想在派生的图像中进行额外的初始化 从此,在下面添加一个或多个 *.sql、*.sql.gz 或 *.sh 脚本 /docker-entrypoint-initdb.d(必要时创建目录)。 入口点调用 initdb 后创建默认 postgres 用户 和数据库,它将运行任何 *.sql 文件,运行任何可执行的 *.sh 脚本,并获取其中找到的任何不可执行的 *.sh 脚本 目录在启动服务之前做进一步的初始化。

    但是,根据您上面发布的日志,我认为您错过了一个问题。

    警告:/docker-entrypoint-initdb.d 中的脚本仅在您运行时才运行 以空的数据目录启动容器;任何 容器启动时,预先存在的数据库将保持不变。

    所以,我会尝试清空database_data 目录并再次运行docker-compose up

    【讨论】:

    • 在容器关闭后我没有任何卷来保存数据并且我收到相同的日志消息。我必须做的是删除关闭容器,然后重新运行我的 docker compose 文件。
    【解决方案3】:

    遇到了类似的问题,对我有用的是删除容器和卷

    按 id 列出所有容器:

    docker container ls -qa
    

    对每个容器运行:

    docker container rm [id]
    

    与卷相同:

    docker volume ls
    docker volume rm [VolumeName]
    

    当我docker-compose up -d 一切正常

    reference for removing from docker

    【讨论】:

    • 空数据目录意味着 postgres 重新运行初始化步骤
    【解决方案4】:

    我必须先执行 docker-compose down --volumes 才能删除卷。

    然后必须使用:docker-compose up --build 以确保 PostGres 使用 sql 文件。

    还要确保db 目录与 docker 文件处于同一级别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 1970-01-01
      相关资源
      最近更新 更多