首页 > 解决方案 > 容器是数据库服务器。容器启动后,如何要求它的 Dockerfile 完成构建?

问题描述

我正在使用postgis/postgisDocker 映像为我的应用程序设置数据库服务器。

  1. 数据库服务器必须先创建表空间,然后再创建数据库。
  2. 然后每次另一个应用程序从另一个容器启动时,它将运行一个Liquibase脚本,在需要时更新数据库模式(创建表、索引......)。

在终端上,为了准备数据库容器,我正在运行以下命令:

# Run a naked Postgis container
sudo docker run --name ecoemploi-postgis 
     -e POSTGRES_PASSWORD=postgres 
     -d -v /data/comptes-france:/data/comptes-france postgis/postgis

# Send 'bash level' commands to create the directory for the tablespace
sudo docker exec -it ecoemploi-postgis 
     bin/sh -c 'mkdir /tablespace && chown postgres:postgres /tablespace'

然后要完成我的步骤 1,我必须运行 SQL 语句来创建表空间PostGIS,并通过CREATE DATABASE.

psql我在我的容器下手动连接自己:

sudo docker exec -it ecoemploi-postgis bin/sh 
     -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" 
     -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres'

我手动运行这些命令:

CREATE TABLESPACE data LOCATION '/tablespace';
CREATE DATABASE comptesfrance TABLESPACE data;
exit

但是我想从一个Dockerfile完成所有需要的工作的容器中创建一个容器。困难在于它必须分两部分完成:

  1. 容器启动前的一个。(创建目录,授予他们用户:组)。
  2. 第一次启动之后:声明表空间并创建基础。如果我很好地理解了我拍摄的基本图像,它应该在入口点docker-entrypoint.sh运行后完成吗?

Dockerfile完成所有这些步骤后编写创建容器的好方法是什么?

标签: postgresqldocker

解决方案


PostGIS图像“基于官方postgres图像”,因此应该可以使用该/docker-entrypoint-initdb.d机制。您放入该目录的任何文件都将在数据库容器第一次启动时运行。 Dockerfilepostgis已经使用此目录将 PostGIS 扩展安装到默认数据库中。

这意味着您可以将构建时设置直接放入 Dockerfile,并将启动时脚本复制到该目录中。

FROM postgis/postgis:12-3.0
RUN mkdir /tablespace && chown postgres:postgres /tablespace
COPY createdb.sql /docker-entrypoint-initdb.d/20-createdb.sql
# Use default ENTRYPOINT/CMD from base image

对于您描述的特定设置,这可能不是必需的。每个数据库都在一个隔离的文件系统空间中运行,并从一个空的数据目录开始,因此没有特别需要创建一个备用数据目录;如果您需要隔离存储,Docker 风格是只运行多个数据库。同样,基本postgres映像将在第一次启动时为您创建一个数据库(由POSTGRES_DB环境变量命名)。


推荐阅读