Возможно, самый простой способ сделать это - создать каталог на хосте, содержащий два файла .sql
, и подключить его в контейнере Docker при запуске. Если в постоянном хранилище базы данных еще нет, контейнер будет запускать их автоматически при создании базы данных. См. «Инициализация свежего экземпляра» в документации по изображению mysql .
MYSQL_PORT := 33061
MYSQL_ROOT_PASSWORD := secret
PORTS := -p $(MYSQL_PORT):3306
VOLUMES := -v $(PWD)/scripts:/docker-entrypoint-initdb.d
ENVS := -e MYSQL_ROOT_PASSWORD=$(MYSQL_ROOT_PASSWORD)
IMAGE := mysql:5.7
RUN_OPTS := $(PORTS) $(VOLUMES) $(ENVS)
ARGS := --character-set-server=utf8mb4
run:
docker run -d $(RUN_OPTS) $(IMAGE) $(ARGS)
Если вы не можете этого сделать, тогда вы можете запустить обычный клиент MySQL на хосте. Это позволяет избежать нескольких проблем, связанных с контейнером, имеющим собственную файловую систему, эффективно требующим наличия прав root для запуска команд docker
и проблем с цитированием оболочки. (docker exec
, вероятно, не должно быть частью вашего основного рабочего процесса.)
setup: setup.sql
mysql -h localhost -P $(MYSQL_PORT) -w -u root -p $(MYSQL_ROOT_PASSWORD) < $<
create_tables: create_tables.sql
mysql -h localhost -P $(MYSQL_PORT) -w -u root -p $(MYSQL_ROOT_PASSWORD) < $<
Если вы должны использовать docker exec
, помните, что перенаправление оболочки происходит за до того, как управление передается на землю Docker: если вы docker exec ... < file
, ваша локальная оболочка открывает file
на хосте для чтения и это становится стандартным вводом для команды docker exec
. В вашем примере ваша команда оболочки читает из хоста /tmp/setup.sql
и выдает ошибку «file not found».