【发布时间】:2019-03-04 22:09:54
【问题描述】:
我想通过两个任务准备自定义图像(基于官方Postges image):
- 下载数据(如通过wget获取CSV文件),
- 将数据加载到数据库中(创建表、插入)。
我想在构建映像期间执行这两个步骤,而不是在运行容器期间执行,因为每个步骤都需要大量时间,并且我想构建一次映像并快速运行多个容器。
我知道如何在构建映像期间执行第 1 步(下载数据),但我不知道如何在构建映像期间将数据加载到数据库中,而不是运行容器(第 2 步)。
示例:
(下载 - 在构建映像期间,加载 - 在运行容器期间)
Dockerfile:
FROM postgres:10.7
RUN apt-get update \
&& apt-get install -y wget \
&& rm -rf /var/lib/apt/lists/*
COPY download.sh /download.sh
RUN /download.sh
download.sh:
#!/bin/bash
cd /docker-entrypoint-initdb.d/
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/northwindextended/northwind.postgre.sql
要下载数据,我自己运行脚本。要加载数据,我使用 Postgres 官方图像中的“initialization scripts”实用程序。
建筑形象:
docker build -t mydbimage .
运行图:
docker run --name mydbcontainer -p 5432:5432 -e POSTGRES_PASSWORD=postgres -d mydbimage
运行后,可以看到加载数据需要多少时间:
docker logs mydbcontainer
这个示例数据集很小,但是对于更大、长时间运行的容器来说很尴尬。
【问题讨论】:
-
您无法真正使用来自任何标准数据库图像的预填充数据来创建图像。不过,您可以使用已挂载的主机目录启动数据库并为其拍摄快照作为一种简单的解决方法。
-
我想避免创建卷,第一次运行时创建备份数据库,然后再恢复它。我认为有一种方法可以使用“默认”用户/密码启动数据库,加载数据并将其保存为图像层。但是如何处理标准图像而不是创建空图像并自己安装Postgres?
-
您希望您的数据库将其数据存储在一个卷上,否则您将遇到性能问题。容器文件系统慢,卷文件系统快
标签: database postgresql docker