Docker совет №23: Импорт SQL-файла с docker-compose

May 10, 2018 06:30 · 256 words · 2 minute read docker mysql psql

При работе с базами данных (например, PostgreSQL, MariaDB или MySQL) в docker-контейнере, вам наверняка понадобится импортировать данные из SQL-файла. Давайте разберемся!

В данной статье рассмотрим пример с PostgreSQL и утилитой psql, но для баз данных MariaDB / MySQL и утилиты mysql все будет работать аналогично. Кроме того, для упрощения, в командах я не использую имена пользователей / пароли (в реальной ситуации вам придется их добавить самостоятельно).

Итак, импорт данных из файла в общем случае (когда не используются docker-контейнеры) будет выглядеть так:

psql exampledb < exampledump.sql

Все просто - следует указать утилите psql в какую базу данных необходимо импортировать данные и перенаправить содержимое файла с дампом через STDIN.

Если вы запускаете docker-контейнер с PostgreSQL с помощью утилиты docker-compose, то кажется “очевидным” попробовать импортировать данные из SQL-файла командой:

docker-compose exec postgres psql exampledb < exampledump.sql

Теоретически, это должно было сработать, но (по крайней мере в docker-compose версии 1.20) вместо импорта данных получаем ошибку:

ValueError: file descriptor cannot be a negative integer (-1)

Можно к команде exec добавить ключ -T (для отключения TTY) - в таком случае ошибки не будет, но, увы, данные тоже импортированы не будут.

Возможно, в следующих версиях docker-compose данную “особенность” устранят, но на сегодняшний день для импорта SQL-файла в базу данных внутри docker-контейнера можно воспользоваться такой командой:

docker exec -i $(docker-compose ps -q postgres) psql exampledb < exampledump.sql

Команду можно упростить, заменив $(docker-compose ps -q postgres) на имя docker-контейнера (если вы его знаете или явно задаете в файле docker-compose.yml).

На этом все, теперь вы знаете, как импортировать данные из SQL-файла в базу данных внутри docker-контейнера!

tweet Share