postgresql - 容器是数据库服务器。容器启动后,如何要求它的 Dockerfile 完成构建?
问题描述
我正在使用postgis/postgis
Docker 映像为我的应用程序设置数据库服务器。
- 数据库服务器必须先创建表空间,然后再创建数据库。
- 然后每次另一个应用程序从另一个容器启动时,它将运行一个
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
完成所有需要的工作的容器中创建一个容器。困难在于它必须分两部分完成:
- 容器启动前的一个。(创建目录,授予他们用户:组)。
- 第一次启动之后:声明表空间并创建基础。如果我很好地理解了我拍摄的基本图像,它应该在入口点
docker-entrypoint.sh
运行后完成吗?
Dockerfile
完成所有这些步骤后编写创建容器的好方法是什么?
解决方案
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
环境变量命名)。
推荐阅读
- sql-server - 列出所有在 SQL 中没有活动合同的供应商
- python - 如何根据另一列有条件地添加具有新日期时间的新列
- node.js - 保存数据库中每个字段的样式
- go - goroutine 错误:返回的参数太多
- javascript - Javascript REGEX 将数组转换为带有 {} 每个元素的字符串
- flutter - Flutter TextFormField 应该根据 firebase 中的数据给出建议
- sql - 如何通过忽略 WHERE 条件强制 SQL row_number() 从 1 开始
- python - 如何根据python中的两个不同列(不使用循环)获取每个行对象的转换字符串?
- karate - 使用 responseHeaders(Set-Cookie [] 选项)设置 cookie 不会在较新的空手道版本(1.0.0、1.0.1)中传递后续 API 请求
- python - 在表格中添加列