建设过程中填充的Postgres码头工人形象(不运行)(Populating Postgres Do

2019-10-28 10:24发布

我要准备自定义图像(根据官方Postges图像有两个任务):

  1. 下载数据(例如,通过获得wget的CSV文件)
  2. 将数据装载到数据库(创建表,插入)。

我想没有运行容器,因为他们每个人花费大量的时间在建筑形象,在做这两个步骤,我想一旦建立图像和快速运行许多容器。

我知道如何建立图像时执行步骤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图像”工具。

建筑形象:

docker build -t mydbimage .

运行图像:

docker run --name mydbcontainer -p 5432:5432 -e POSTGRES_PASSWORD=postgres -d mydbimage 

运行后,你可以看到装载数据多少需要时间:

docker logs mydbcontainer

这个例子的数据集很小,但随着更大,很长一段时间运行的容器是尴尬。

Answer 1:

您可以解剖上游Dockerfile及其docker-entrypoint.sh和只挑选所需的片段初始化数据库:

FROM postgres:10.7

ENV PGDATA /var/lib/postgresql/datap-in-image
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA" # this 777 will be replaced by 700 at runtime (allows semi-arbitrary "--user" values)

RUN set -x \
  && apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \
  && wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/northwindextended/northwind.postgre.sql \ 
    -O /docker-entrypoint-initdb.d/northwind.postgre.sql \
  && cp ./docker-entrypoint.sh ./docker-entrypoint-init-only.sh \
  && sed -ri '/exec "\$@"/d' ./docker-entrypoint-init-only.sh \
  && ./docker-entrypoint-init-only.sh postgres \
  && rm ./docker-entrypoint-initdb.d/northwind.postgre.sql ./docker-entrypoint-init-only.sh \
  && apt-get purge -y --auto-remove ca-certificates wget

构建,运行和测试:

docker build -t mydbimage .

# bring up the database
docker run --rm mydbimage --name pgtest

# run this in another terminal to check for the imported data 
docker exec -ti pgtest psql -v ON_ERROR_STOP=1 --username "postgres" --no-password --dbname postgres --command "\d"

注意事项:

  • 在此设置下, 没有数据库密码设置。 您可以在构建过程中添加,但那么这将在图像中坚持。 您将需要采取预防措施,没有人会访问你的形象。 根据设置的不同,这可能是难以实现的,这也许就是甚至是不可能的。
  • 第二个问题是,写入你的数据库是短暂的 。 有建设坚持导入的数据中没有音量。 这就是为什么PGDATA更改为未声明为卷目录。

基本上,这些是为什么构建在上游储存库中启动容器代替时的进口被处理的原因。 如果您有只读它可能仍然是有意义的构建过程中导入,以节省时间和容器的启动过程中更容易处理,用于非机密数据。



文章来源: Populating Postgres Docker image during building (not running)