Рейтинг:0

Почему мой контейнер не содержит данных БД после того, как я его зафиксировал?

флаг fr

Я пытаюсь создать контейнер PostgreSQL, который уже содержит данные разработки. Я могу видеть данные, которые я создал, но когда я совершить, толкать, и тяга изображение, данных нет.

Ниже мой Dockerfile:

ОТ постгис/постгис:11-2.5
ОБСЛУЖИВАТЕЛЬ Я

# Содержимое файла 20-init_db.sql:
# СОЗДАТЬ РАСШИРЕНИЕ, ЕСЛИ НЕ СУЩЕСТВУЕТ btree_gist;
# СОЗДАТЬ РАСШИРЕНИЕ, ЕСЛИ НЕ СУЩЕСТВУЕТ hstore;
КОПИРОВАТЬ ./20-init_db.sql/docker-entrypoint-initdb.d/20-init_db.sql
КОПИРОВАТЬ ./make_data.sh /make_data.sh

Я создаю контейнер с помощью приведенного ниже сценария, и данные успешно заполняются.

#!/бин/баш

aws ecr get-login-password --region us-east-1 | \
    docker login --username AWS --password-stdin 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com

aws ecr create-repository --repository-name dev_postgres --region us-east-1

# Убедитесь, что среда сборки чистая
остановка докера dev_postgres_container
докер rm dev_postgres_container
докер рми dev_postgres_img

# Подготовить контейнер
docker build -f postgres.Dockerfile -t dev_postgres_img .
docker run -d --name dev_postgres_container \
    -e POSTGRES_DB=база_данных \
    -e POSTGRES_USER=пользователь_\
    -e POSTGRES_PASSWORD=пароль \
    -e PGDATA=/var/lib/postgresql/data/pgdata
    dev_postgres_img
docker exec -it dev_postgres_container bash /make_data.sh

###
### Это возвращает правильное количество пользователей, поэтому на данный момент в контейнере есть данные.
###
docker exec -it dev_postgres_container /usr/bin/psql -U the_user the_database -c "выберите количество (*) из auth_user;"

# Зафиксируйте состояние контейнера и сохраните его в Amazon ECR:
docker commit $(docker ps -q --filter "name=dev_postgres_container") 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com/dev_postgres:11-2.5-with-data

# Также пометьте его «последним» и отметкой времени
тег докера 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com/dev_postgres:11-2.5-with-data 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com/dev_postgres:latest-with-data
тег докера 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com/dev_postgres:11-2.5-with-data 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com/dev_postgres:$( date -u +%Y%m%d_%H%MZ )-с-данными

# Толкать
docker push 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com/dev_postgres --all-tags

Однако, когда я извлекаю контейнер в изолированной среде, данных нет:

заварить установить виртуальный бокс
варить установить мультипасс
sudo multipass set local.driver=virtualbox
многопроходный запуск --name ubuntu2
многопроходное монтирование ~/.aws ubuntu2:/home/ubuntu/.aws
многопроходное монтирование ./db ubuntu2:/home/ubuntu/db
многопроходный exec ubuntu2 -- bash /home/ubuntu/db/test_db_container.sh

### Содержимое test_db_container.sh ниже: ###

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

sudo apt-get install -y awscli

# Вытащите контейнер Docker:
aws ecr get-login-password --region us-east-1 | \
    sudo docker login --username AWS --password-stdin 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com
sudo docker pull 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com/dev_postgres:latest-with-data

sudo docker run -d --name the_db 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com/dev_postgres:latest-with-data

###
### Таблица auth_user не существует.
###
sudo docker exec -it the_db /usr/bin/psql -U the_user the_database -c "выбрать количество (*) из auth_user;"

история докеров sudo 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com/dev_postgres:latest-with-data

## Результат:
ИЗОБРАЖЕНИЕ СОЗДАНО СОЗДАНО РАЗМЕРОМ КОММЕНТАРИЙ
854dbef239c2 23 часа назад postgres 70B
4b1bd66a8d33 23 часа назад КОПИРОВАТЬ ./make_data.sh /make_data.sh 3.03kB buildkit.dockerfile.v0
<отсутствует> 23 часа назад COPY ./20-init_db.sql /docker-entrypoint-ini… 188B buildkit.dockerfile.v0
<отсутствует> 23 часа назад MAINTAINER Me 0B buildkit.dockerfile.v0
[...]

Примечание: я рассматривал возможность создания контейнера томов данных, но этот метод показался мне более простым и лучше документированным.

Другое примечание: я не могу добавить данные в Dockerfile, потому что Postgres должен быть запущен, прежде чем данные можно будет вставить.

Почему нет докер коммит сохранить состояние моего контейнера? Почему изображение не содержит данных?

mreferre avatar
флаг nl
Вероятно, это потому, что объем данных представляет собой .... объем. См. [здесь] (https://stackoverflow.com/questions/27377876/docker-postgres-with-initial-data-is-not-persisted-over-commits)
Travis avatar
флаг fr
Да, это была проблема.Я не осознавал, что контейнер PostgreSQL устанавливает `/var/lib/postgresql/data` как том. Решение [здесь] (https://stackoverflow.com/a/29956964/1477364), хотя чем больше я читаю, тем больше похоже, что контейнер только для данных - лучшая практика для этого. (Отправьте свой комментарий как ответ, и я приму его.)
mreferre avatar
флаг nl
Прохладно. Рад слышать это. Выполнено.
Рейтинг:1
флаг nl

Согласно комментариям в основной теме, решение было похоже на то, что было предложено в этот существующий отвечать. Это сводится к тому, что каталог данных является томом и, следовательно, находится вне контекста изменяемого/фиксируемого контейнера.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.