LINUX.ORG.RU

Как развернуть в Docker БД из дампа?

 


0

2

У меня есть веб-приложение, которое использует БД MySQL. Я хочу упаковать его в 2 контейнера:

  1. Само приложение
  2. База данных

Моя база данных уже наполнена данными.

Возможно ли написать Dockerfile для контейнера MySQL, чтобы потом по команде docker build . 1) скачался образ MySQL, 2) создалась новая БД, и чтоб в нее 3) из дампа залилась моя БД.

Я не знаю, как сделать 3)

Да можно, читай опсиание к dockerfiles mysql с dockerhub там это точно есть

https://hub.docker.com/_/mysql

When a container is started for the first time, a new database with the specified name will be created and initialized with the provided configuration variables. Furthermore, it will execute files with extensions .sh, .sql and .sql.gz that are found in /docker-entrypoint-initdb.d. Files will be executed in alphabetical order. You can easily populate your mysql services by mounting a SQL dump into that directory⁠ and provide custom images⁠ with contributed data. SQL files will be imported by default to the database specified by the MYSQL_DATABASE variable.

Kolins ★★★★★
()
Последнее исправление: Kolins (всего исправлений: 1)

чптгпт сказал:

Да, можно настроить Docker для автоматической загрузки данных в MySQL при сборке контейнера. Для этого используйте механизм инициализации MySQL, который позволяет загружать данные из SQL-файлов или скриптов при запуске контейнера.

Вот как это сделать:

Шаги:

  1. Подготовьте дамп вашей базы данных
    Создайте дамп с помощью mysqldump, если он еще не готов:

    mysqldump -u username -p database_name > database_dump.sql
    
  2. Создайте структуру проекта
    У вас должна быть следующая структура:

    .
    ├── Dockerfile
    ├── database_dump.sql
    
  3. Напишите Dockerfile для MySQL
    Пример Dockerfile:

    # Используем официальный образ MySQL
    FROM mysql:8.0
    
    # Устанавливаем переменные окружения для MySQL
    ENV MYSQL_ROOT_PASSWORD=rootpassword
    ENV MYSQL_DATABASE=my_database
    
    # Копируем дамп базы данных в специальную директорию MySQL
    COPY database_dump.sql /docker-entrypoint-initdb.d/
    
    # MySQL автоматически выполнит все .sql файлы в этой директории при первом запуске
    
  4. Создайте контейнер MySQL
    Выполните команду для сборки образа:

    docker build -t my-mysql .
    

    Затем создайте и запустите контейнер:

    docker run -d --name mysql-container my-mysql
    

    После первого запуска MySQL выполнит ваш дамп и создаст базу данных с данными.

Объяснение:

  • /docker-entrypoint-initdb.d/: Любые файлы с расширением .sql или .sh, находящиеся в этой директории, автоматически выполняются MySQL при первом запуске контейнера.
  • MYSQL_ROOT_PASSWORD и MYSQL_DATABASE: Эти переменные окружения используются для задания пароля root и создания базы данных по умолчанию.

Проверка:

Чтобы проверить, что база данных была создана, подключитесь к MySQL внутри контейнера:

docker exec -it mysql-container mysql -u root -p

И выполните:

USE my_database;
SHOW TABLES;

Интеграция с приложением:

Если у вас уже есть контейнер с приложением, создайте docker-compose.yml для запуска обоих контейнеров:

version: '3.8'

services:
  app:
    build: ./app
    ports:
      - "3000:3000"
    depends_on:
      - mysql

  mysql:
    build: ./mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: my_database
    ports:
      - "3306:3306"

Теперь вы сможете запускать оба контейнера вместе:

docker-compose up --build

Это настроит автоматическую инициализацию базы данных с данными и соединение с вашим приложением.

romanlinux ★★★
()
Ответ на: комментарий от truebin

Дамп это набор sql команд. У тебя есть клиент на хосте, есть дамп, есть сокет запущенной в докере базы, вот туда присоединись и залей всё.

В Dockerfile есть смысл только если дамп это часть сборки, то есть тебе везде нужно разворачивать базу именно с таким стартовым наполнением.

neumond
()
Ответ на: комментарий от truebin

А почему не нужно?

Потому что имаджи контейнеров не должны хранить данные.

Тогда вручную самому 1 раз восстановить БД из дампа, так?

Да. Подключаешь вольюм по месту хранения данных mysql, запускаешь, заливаешь.

MagicMirror ★★
()
Ответ на: комментарий от MagicMirror

Потому что имаджи контейнеров не должны хранить данные.

А, да. Я в курсе. Вопрос мой в том и состоит, что при первом запуске MySQL из docker-compose.yml можно создать чистую БД, подключить volume к БД.

И я хотел, чтобы дамп моей базы сразу залился в чистую БД, которая уже, само-собой, подключена к volume.

truebin
() автор топика