docker4drupal как сделать экспорт и импорт БД без drush?

Аватар пользователя VasyOK VasyOK 18 ноября в 19:48

Извините за дебильный вопрос.

На реальных хостингах экспорт и импорт БД без drush можно выполнить через:
mysqldump -u USER -pPASSWORD DATABASE > dump.sql
mysql -u USER -pPASSWORD -f DATABASE < dump.sql

А как это сделать на Ubuntu + docker4drupal
Пишет:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory")

Лучший ответ

Аватар пользователя VasyOK VasyOK 20 ноября в 2:40

Итак чтобы сделать импорт или экспорт БД без средств Друпала, нужно:

В docker-compose.yml
Раскомментировать

volumes:
      - ./mariadb-init:/docker-entrypoint-initdb.d # Place init .sql file(s) here.

Создастся папка mariadb-init. В нее можно положить дамп БД в форматах *.sql, *.sql.gz, *.sh.
Если просто положить файл туда положить - ничего не произойдет.

А вот если

  • удалить контейнеры проекта (БД-у с ними) через $docker-compose rm или $docker-compose down
  • и создать их заново через $docker-compose up -d

... дамп БД автоматом импортируется в рабочую БД указанную в .env фале.

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

Поэтому в volumes можно прописать:
- ./mariadb:/var/lib/mysql

При рестарте проекта создастся папка mariadb. В нее ложим наш *.sql файл. Не забываем убрать лишнее из mariadb-init. Вынуть из холодильника бегемота, положить слона.

Заходим в контейнер mysql
$ docker-compose exec mariadb sh
Проверяем есть ли там файл дампа
/var/lib/mysql $ ls

собственно команды экспорта и импорта БД в контейнере работают (и нет нужды удалять контейнеры проекта):

mysqldump -u USER -pPASSWORD DATABASE > dump.sql
mysql -u USER -pPASSWORD -f DATABASE < dump.sql

https://wodby.com/docs/1.0/stacks/drupal/local/#database-import-and-export - непонятная документация

Комментарии

Аватар пользователя VasyOK VasyOK 18 ноября в 20:00

Не знаю. Как это узнать?
Сайт на D7 у себя развернул - работает. Значит зашел?

Аватар пользователя ivnish ivnish 18 ноября в 20:15

Ты используешь mysql в докере. В твоей системе mysql не установлен. Вопрос: где нужно вводить команды работы с mysql, в убунте или в докер контейнере?

Аватар пользователя VasyOK VasyOK 19 ноября в 13:17

ок, как зайти в докер контенер?

Я запускаю сайт у себя так:
$ cd ~/Projects/local/myproject/
$ source ~/Projects/.bash_profile
$ docker-compose up -d
$ drush updb

Последняя команда, как пример. Или как-то еще заходить надо?

Аватар пользователя gun_dose gun_dose 18 ноября в 22:23

Кидай архив в папку, куда монтируются файлы контейнера mariadb. Потом docker-compose exec mariadb sh - ты попадаешь в контейнер базы данных. И вот там уже выполняешь команду mysql

Аватар пользователя VasyOK VasyOK 18 ноября в 22:40

А как узнать куда монтируются файлы контейнера mariadb?
Я понимаю, вам смешно, но не делал я такого раньше.

Аватар пользователя gun_dose gun_dose 18 ноября в 23:19

У тебя после команды docker-compose down база данных удаляется? Если да, то файлы никуда не смонтированы и это не очень хорошо. Папка, куда монтируется, указана в docker-compose.yml в описании сервиса mariadb в секции volumes

Аватар пользователя VasyOK VasyOK 19 ноября в 0:03

Удалю проекты командой docker-compose rm. Тогда и БД вроде удаляется.

В docker-compose.yml :

services:
  mariadb:
    image: wodby/mariadb:$MARIADB_TAG
    container_name: "${PROJECT_NAME}_mariadb"
    stop_grace_period: 30s
    environment:
      MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD
      MYSQL_DATABASE: $DB_NAME
      MYSQL_USER: $DB_USER
      MYSQL_PASSWORD: $DB_PASSWORD
#    volumes:
#      - ./mariadb-init:/docker-entrypoint-initdb.d # Place init .sql file(s) here.
#      - /path/to/mariadb/data/on/host:/var/lib/mysql # Use bind mount

# - /path/to/mariadb/data/on/host:/var/lib/mysql - это раскомментировать? Как /path/to/mariadb/ узнать?

- ./mariadb-init:/docker-entrypoint-initdb.d # Place init .sql file(s) here. - раскоментировал. Странный какой-то путь. Не понимаю где это относительно корня проекта.

Итак после перезапуска проекта в его корне возникла папка mariadb-init. Попытался в нее положить дамп БД. Вышло через sudo.

~/Projects/local/myproject/mariadb-init$ mysql -u nafanya -pnafanya -f nafanya < dump.sql
пишет:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory")

Аватар пользователя gun_dose gun_dose 19 ноября в 0:07

О, так просто положи дамп базы в папку mariadb-init и рестартани докер. Оттуда при старте автоматом импортируется

Аватар пользователя gun_dose gun_dose 19 ноября в 0:09

И ещё похоже, что ты запускаешь mysql не в контейнере, а на своей машине. Это неправильно. Контейнер - это же отдельная операционная система

Аватар пользователя VasyOK VasyOK 19 ноября в 0:33

дамп базы положил в mariadb-init на предидущем комменте. При старте $ docker-compose up -d этот файл не импортируется автоматом в БД сайта.
Как запустить в контейнере?

Аватар пользователя schnauss schnauss 19 ноября в 8:26

Васёк, ты 13 лет на друпал.ру, а до сих пор как джун. Используешь докер, но даже не пытаешься понять как он работает. Всё надо разжевать и в рот положить

Аватар пользователя VasyOK VasyOK 19 ноября в 14:41

"Используешь докер, но даже не пытаешься понять как он работает."
Художнику не нужно знать химический состав краски. Работает - и хорошо. Пытаюсь заставить на Докере работать то, что работало на Опенсервере.

Доксал не пошел у меня.

https://youtu.be/VEIOmxAnoTg
Тут где-то показан заход в контейнер?

Аватар пользователя ivnish ivnish 19 ноября в 14:42

VasyOK wrote: Доксал не пошел у меня.

Что именно не пошло? Давай попробуем установить доксал. Там многие вещи делаются проще мы сможем тебе что-то подсказать по работе с ним (я уже давно не юзаю d4d и вообще не помню что там и как, а доксал использую каждый день)

Аватар пользователя gun_dose gun_dose 19 ноября в 23:11

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

Аватар пользователя VasyOK VasyOK 19 ноября в 16:33

Может поробую как нить позже. Я ж не обвиняю никого, что у меня что-то не выходит.
Сейчас пробую с D4D.

Итак:

$ docker-compose exec mariadb sh
/var/lib/mysql $ mysql -u USER -pPASSWORD -f DATABASE < dump.sql
sh: can't open dump.sql: no such file

Значит все таки mysql запускается, но файл дампа не находит. Куда его ложить?

/var/lib/mysql $ ls
aria_log.00000001   f35e031addfe.pid    ib_logfile0         ibdata1             multi-master.info   myproject
aria_log_control    ib_buffer_pool      ib_logfile1         ibtmp1              mysql               performance_schema

Блин где эти файлы? Ну могу их найти?

Ок пробую в лоб:

/var/lib/mysql $ mysql -u USER -pPASSWORD -f DATABASE < /home/alex/Projects/local/myproject/dump.sql
sh: can't open /home/alex/Projects/local/myproject/dump.sql: no such file
Аватар пользователя VasyOK VasyOK 19 ноября в 16:49

Как его запустить снаружи контейнера или куда файл БД положить, чтобы узнал?

Аватар пользователя gun_dose gun_dose 19 ноября в 23:04
1

Блин, ну ёмое. Вот прикинь, идёшь ты в гости в первый раз, зашёл в незнакомый подъезд. Как определить, есть ли лифт? Посмотреть по сторонам, заглянуть за угол и т.д. Точно так же заходишь в контейнер, и как определить, есть ли в контейнере файл? Посмотри по сторонам! Есть же команда ls -l. Есть pwd, и так далее. В чём проблема воспользоваться этими командами, находясь внутри контейнера?

Аватар пользователя VasyOK VasyOK 20 ноября в 0:32

В комменте выше ж написал "/var/lib/mysql $ ls" - нет там файла дампа. И я не понимаю как его туда положить.

Сейчас так :
volumes:
- ./mariadb-init:/docker-entrypoint-initdb.d # Place init .sql file(s) here.
# - /path/to/mariadb/data/on/host:/var/lib/mysql # Use bind moun

Последнюю строчку раскомментировать? path/to/mariadb/data/on/host - как определить?

Аватар пользователя gun_dose gun_dose 20 ноября в 0:45
2

Не определить, а задать. Какую папку напишешь, туда и ляжет база. Как вариант, сделать так:

- ./mariadb:/var/lib/mysql

В таком случае в корне проекта создастся папка mariadb и файлы базы лягут туда. В эту же папку можно вкинуть дамп и его будет видно из контейнера.

PS: когда меняешь волюмы, надо делать docker-compose down, чтобы изменения вступили в силу. Просто рестартануть не поможет, нужно именно удалить контейнер.

Аватар пользователя VasyOK VasyOK 20 ноября в 2:40

Итак чтобы сделать импорт или экспорт БД без средств Друпала, нужно:

В docker-compose.yml
Раскомментировать

volumes:
      - ./mariadb-init:/docker-entrypoint-initdb.d # Place init .sql file(s) here.

Создастся папка mariadb-init. В нее можно положить дамп БД в форматах *.sql, *.sql.gz, *.sh.
Если просто положить файл туда положить - ничего не произойдет.

А вот если

  • удалить контейнеры проекта (БД-у с ними) через $docker-compose rm или $docker-compose down
  • и создать их заново через $docker-compose up -d

... дамп БД автоматом импортируется в рабочую БД указанную в .env фале.

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

Поэтому в volumes можно прописать:
- ./mariadb:/var/lib/mysql

При рестарте проекта создастся папка mariadb. В нее ложим наш *.sql файл. Не забываем убрать лишнее из mariadb-init. Вынуть из холодильника бегемота, положить слона.

Заходим в контейнер mysql
$ docker-compose exec mariadb sh
Проверяем есть ли там файл дампа
/var/lib/mysql $ ls

собственно команды экспорта и импорта БД в контейнере работают (и нет нужды удалять контейнеры проекта):

mysqldump -u USER -pPASSWORD DATABASE > dump.sql
mysql -u USER -pPASSWORD -f DATABASE < dump.sql

https://wodby.com/docs/1.0/stacks/drupal/local/#database-import-and-export - непонятная документация

Аватар пользователя gun_dose gun_dose 20 ноября в 9:20

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

Аватар пользователя ivnish ivnish 20 ноября в 9:23

У нас помимо локалки есть ещё дев сервер, а иногда ещё и стейдж. Если с локальной базой что-то случится, я всегда смогу взять базу с дева Smile

Аватар пользователя gun_dose gun_dose 20 ноября в 10:14

На деве не будет лежать база сайта, который ты начал делать только вчера и ещё даже ни разу не экспортировал конфиги))

Аватар пользователя VasyOK VasyOK 20 ноября в 14:03

gun_dose wrote: Вообще, базу всегда лучше держать смонтированной

Как понять, что она смонтирована или как смонтировать?

Аватар пользователя gun_dose gun_dose 20 ноября в 15:16
1

Как смонтировать, я писал выше:

- ./mariadb:/var/lib/mysql

А проверить легко. Внутри папки mariadb будет создана папка с именем базы данных, а в ней будут файлики с названиями таблиц.