Docker commit - изменения в БД не сохраняются - PullRequest
0 голосов
/ 24 августа 2018

Я установил последнюю версию Docker CS, получил образ ЛАМПЫ от Docker Hub. Я пытаюсь создать в нем БД и создать новый образ с этой БД, сохраненной в нем.

  1. Запустить контейнер: docker run --name mycontainer fauria/lamp Это запускает контейнер на основе Ubuntu и запускает сервер Apache. Сервер MySQL также работает в контейнере.
  2. Оболочка контейнера доступа: docker exec -i -t mycontainer bash
  3. Создайте БД и выполните несколько команд MySQL: команды на ней: mysql -u root CREATE DATABASE mydbname; USE mydbname; CREATE FUNCTION ... ...
  4. Остановить контейнер: docker stop mycontainer
  5. Создать изображение: docker commit docker ps -l -q mynickname/appname:v1
  6. Снять контейнер docker container rm mycontainer

Теперь я ожидал, что если я запущу контейнер на основе нового образа, у меня уже будет база данных. Но это не там. docker run --name mycontainer --rm -p 80:80 -e LOG_STDOUT=true -e LOG_STDERR=true -e LOG_LEVEL=debug -v /home/username/dev/appname/www:/var/www/html mynickname/appname:v1

Что мне не хватает?

Ответы [ 3 ]

0 голосов
/ 25 августа 2018

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

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

Например: -

В официальном примере mysql

$ docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

Вы видите, что они монтируют том, чтобы сохранить данные и сохранить их при перезапуске контейнера.

Ура!

0 голосов
/ 27 августа 2018

Наличие данных, фиксируемых с изображением, является полезным сценарием для тестирования. При использовании готового базового образа вам, возможно, придется удалить записи VOLUME, однако, см. docker-copyedit .

0 голосов
/ 25 августа 2018

Причина в том, что /var/lib/mysql указан как VOLUME в файле Docker.

Внесенные вами изменения сохраняются между командами docker stop <yourcontainer> и docker start <yourcontainer>.Но когда вы фиксируете контейнер, каждый каталог, помеченный как VOLUME в Dockerfile, заменяется его исходным содержимым.(Это происходит, даже если вы не подключили внешний том к этому каталогу.) См. docker commit .

Вы можете легко проверить, что ваши другие изменения сохраняются в коммите, внося изменениягде-то за пределами VOLUME каталогов.Например, запустите date>/mydate внутри контейнера и затем подтвердите его.Когда вы затем запустите новый контейнер из этого образа, файл /mydate все еще будет там.

Если вы хотите сохранить изменения базы данных, вы можете сделать это путем клонирования репозитория, а затем удалить строкуVOLUME /var/lib/mysql из Dockerfile.Если вы затем создадите новый образ и запустите его, он сохранит изменения вашей базы данных при фиксации контейнера.

Обычно в производственной среде файлы базы данных монтируются либо в контейнере данных, либо на хосте.,Таким образом, данные базы данных будут сохранены в контейнере данных или на хосте, если вы подтвердите контейнер.

...