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

时间:2020-01-13 11:20:17

标签: 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

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

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";

当我列出数据库是Postgres容器时,找不到数据库。这个问题的根源可能是什么?

3 个答案:

答案 0 :(得分:6)

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

按 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

答案 1 :(得分:5)

根据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

答案 2 :(得分:4)

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

PostgreSQL Database directory appears to contain a database; Skipping initialization

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

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

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

docker-compose down --volumes
相关问题