Почему докер не сохраняет базу данных при отключении?

Ссылка скопирована
1 ответ

Привет.
Вот докер-композ файл:

db:       image: mysql:8.0       container_name: bk-mysql       command: --sort_buffer_size=512K       working_dir: /app       restart: always       volumes:         - .:/app         - ./dump/dump.sql:/docker-entrypoint-initdb.d/dump.sql        environment:         - MYSQL_ROOT_PASSWORD=root_pass         - MYSQL_DATABASE=base         - MYSQL_USER=base_user         - MYSQL_PASSWORD=user_pass       ports:         - "8082:3306"

db: image: mysql:8.0 container_name: bk-mysql command: --sort_buffer_size=512K working_dir: /app restart: always volumes: - .:/app - ./dump/dump.sql:/docker-entrypoint-initdb.d/dump.sql environment: - MYSQL_ROOT_PASSWORD=root_pass - MYSQL_DATABASE=base - MYSQL_USER=base_user - MYSQL_PASSWORD=user_pass ports: - "8082:3306"

Почему-то при включении (docker-compose up) база данных успешно берется из /dump/dump.sql и вставляется в энтрипоинт. Но при отключении (docker-compose down) обратный процесс не происходит, хотя вроде как сказано, что связь двусторонняя. Я что-то не дописал?

Задача: чтобы при удалении контейнера база данных экспортировалась.

Дополнительно:

Ничего не понятно, что вы ожидаете, какой результат?
При docker-compose down контейнер удаляется, БД не сохраняется. Никакой обратный процесс не нужен.

upd.:
lolrofl01,
суммаризируя все варианты ответов/комментариев/советов:
- так как вы хотите не работает
- можно переписать свой entrypoint.sh с отловом SIGTERM, и сохранением дампа в ваш файл (много рисков, провозитесь, а успеет процесс сохранить sql или нет большой вопрос доверия такому бэкапу)
- использовать mount volume/bind в папку - хранить т.е. стейтфул данные бд на хосте
выбирайте.

  • Ожидаю, что произойдет экспорт базы данных и dump.sql перезапишется на новую..
  • lolrofl01, нет это так не работает. То что у вас маунтится файл в папку /docker-entrypoint-initdb.d/ - это просто создатель докер образа предусмотрел инициализацию БД данными.
    что бы сделать бэкап в sql нужно не тушить композ, а сделать экзек, вроде такого:
    docker exec -it db sh -c "mysqldump -uroot -ppass base > /backup"

    docker exec -it db sh -c "mysqldump -uroot -ppass base > /backup"

    предварительно замаунтить еще один том ./backup:/backup
    Нужно будет поиграться, т.к. написал по памяти, не проверяя.
    PS
    хотя можно и не маунтить больше ничего, да просто в /docker-entrypoint-initdb.d/dump.sql

  • akelsey, да, через терминал то я умею. А как-то можно это автоматизировать, чтобы при удалении контейнера это само бэкапилось?)
  • lolrofl01, переписать файл /entrypoint.sh ловить SIGTERM, выполнить нужные действия, пересобрать контейнер и вперёд.
  • lolrofl01, никак, докер даёт приложению очень мало времени на завершение, потом убивает принудительно, с высокой вероятностью никакие потуги не позволят гарантированно записать базу в файл.

    Вообще, советую пересмотреть свою задачу: зачем ей вообще нужны такие манипуляции? Может, нужно базу в докер не засовывать, а запустить на хосте?

  • shurshur,

    Может, нужно базу в докер не засовывать, а запустить на хосте?

    А как это сделать, если вся разработка ведется в докере?

  • lolrofl01,

    А как это сделать, если вся разработка ведется в докере?

    я же ответ в ответе дал:

    - использовать mount volume/bind в папку - хранить т.е. стейтфул данные бд на хосте

    маунт делаете на хост:

    ...       volumes:         - .:/app         - ./dump/dump.sql:/docker-entrypoint-initdb.d/dump.sql         - ./mysql:/var/lib/mysql ...

    ... volumes: - .:/app - ./dump/dump.sql:/docker-entrypoint-initdb.d/dump.sql - ./mysql:/var/lib/mysql ...

  • lolrofl01, разработке можно и в контейнере запустить, и на хосте - как больше нравится.

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

  • akelsey,

    маунт делаете на хост:

    То есть, добавить к моей конструкции:
    - ./mysql:/var/lib/mysql
    и все заработает?

    Только у меня в папке с проектом нет папки mysql. Так что я буду маунтить в контейнер?

  • shurshur, я видимо чего-то не понимаю...у меня база и так в папке с проектом, при docker-compose up эта база прокидывается на docker-entrypoint-initdb.d/dump.sql. Я так понимаю, volume открывает корридор между папкой с проектом и докером, верно же? Получается, что он может использовать базу из моей папки с проектом, разве нет?
  • lolrofl01,

    и все заработает?

    всё так

    Только у меня в папке с проектом нет папки mysql. Так что я буду маунтить в контейнер?

    пустую папку, mysql сам создаст папку и поместит туда папку.

  • akelsey, сейчас попробую. А можете для чайника объяснить, как это работает? В упор не понимаю почему именно так..
  • lolrofl01,

    А можете для чайника объяснить, как это работает? В упор не понимаю почему именно так..

    Вы командой инструктируете докер - смаунтить внешнюю папку с хоста внутрь контейнера. Всё что будет создаваться по этому пути внутри контейнера будет отображено на хостовой машине.

  • lolrofl01, dump.sql скорее всего заливается один раз при первой инициализации базы, а не при каждом запуске. Это не сама база, а её бэкап.

    При запуске докер создась ./mysql (если его нет) и прокинет в /var/lib/mysql внутри контейнера. Сама база инициализируется, видимо зальёт dump.sql при первом запуске (это предположение, я не изучал как устроен этот контейнер, может он и при каждом запуске заливает дамп?), а затем при следующих запусках/перезапусках/пересозданиях контейнера внутри будет /var/lib/mysql с уже накопленными данными.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Андрей PHP Ответ

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

Для того чтобы Docker сохранял данные базы данных при отключении, необходимо использовать тома Docker. Тома позволяют хранить данные вне контейнера, что обеспечивает сохранность данных даже при остановке контейнера.

Приведу пример настройки тома для контейнера с базой данных MySQL в Docker:

docker run -d \
--name mysql-container \
-v /my/mysql/datadir:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
mysql:latest

docker run -d \ --name mysql-container \ -v /my/mysql/datadir:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=my-secret-pw \ mysql:latest

В данном примере мы создаем том `/my/mysql/datadir` на хост-машине и монтируем его в папку `/var/lib/mysql` в контейнере MySQL. Таким образом, данные базы данных будут сохраняться вне контейнера и будут доступны после перезапуска контейнера.

Также, важно убедиться, что вы правильно настроили параметры запуска контейнера для сохранения данных. Например, в случае с MySQL, необходимо указать корректные параметры для сохранения данных внутри контейнера.

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

Если после применения вышеуказанных рекомендаций проблема с сохранением данных базы данных в Docker все еще остается, рекомендуется обратиться к документации Docker и к сообществу разработчиков для получения дополнительной помощи и консультаций.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно