docker-compose 并在初始化时在 Postgres 中创建数据库

Woj*_*icz 13 docker docker-compose

我有个问题。我对 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
Run Code Online (Sandbox Code Playgroud)

当我在日志中启动 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
Run Code Online (Sandbox Code Playgroud)

在我的 init SQL 中只有 1 行:

CREATE DATABASE "MyDataBase";
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*asz 17

根据postgres docker image文档,你做的一切都是正确的。

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

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

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

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

  • “database_data”位于哪里? (9认同)
  • 容器关闭后,我没有任何用于保存数据的卷,并且收到相同的日志消息。我要做的就是删除关闭容器,然后重新运行我的 docker compose 文件。 (7认同)

Lon*_*Rob 15

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

PostgreSQL Database directory appears to contain a database; Skipping initialization
Run Code Online (Sandbox Code Playgroud)

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

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

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

docker-compose down --volumes
Run Code Online (Sandbox Code Playgroud)

  • 这会破坏数据吗?如果我想添加新数据库并保留现有数据库怎么办? (8认同)
  • 哦。这绝对是一个节省时间的方法 - 一直在花时间调试 POSTGRES_USER env var 没有被拾取,谢谢! (3认同)

小智 8

有一个类似的问题,对我有用的是删除容器和卷

按 id 列出所有容器:

docker container ls -qa
Run Code Online (Sandbox Code Playgroud)

对每个容器运行这个:

docker container rm [id]
Run Code Online (Sandbox Code Playgroud)

与卷相同:

docker volume ls
docker volume rm [VolumeName]
Run Code Online (Sandbox Code Playgroud)

当我 docker-compose up -d 一切顺利的时候

从 docker 中删除的参考


Pri*_*jee 8

我必须docker-compose down --volumes先删除卷。

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

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


小智 6

就我而言,我没有向 声明卷/var/lib/postgresql/data,但它总是在 中创建一个卷/var/lib/docker/volumes/,并且数据在停止和启动容器后仍然存在。

因此,我强制重新创建了匿名卷。

docker-compose up --renew-anon-volumes
Run Code Online (Sandbox Code Playgroud)

这样,您就不需要每次都清空database_data目录并再次运行。docker-compose up