Я хочу подготовить пользовательское изображение (на основе официального Postges image ) с двумя задачами:
- Загрузить данные (например, получить файл CSV с помощью wget),
- Загрузка данных в базу данных (создание таблиц, вставки).
Я хочу сделать оба шага во время построения образа, а не во время запуска контейнера, потому что каждый из них занимает много времени, и яхочу создать образ один раз и быстро запустить много контейнеров.
Я знаю, как выполнить шаг 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
Этот пример набора данных небольшой, но с большим, долго работающим контейнером неудобно.