Docker совет №23: Импорт SQL-файла с docker-compose
May 10, 2018 06:30 · 256 words · 2 minute read
При работе с базами данных (например, 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-контейнера!