Запустите скрипт SQL внутри контейнера Docker с помощью Makefile - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть Makefile для запуска Docker-контейнера с MySql. Я хочу запустить файл setup.sql для настройки своей базы данных, но у меня по-прежнему «Не такой файл или каталог». Вот мой Makefile:

CONTAINER = NETFLIX

#DOCKER CONTAINER RELATED
NAME = --name $(CONTAINER)
PASS = -e MYSQL_ROOT_PASSWORD=secret mysql:5.7
CHARSET = --character-set-server=utf8mb4
COLLATION = --character-set-server=utf8mb4

create:
    docker run -d -p 33061:3306 $(NAME) $(PASS) $(CHARSET) $(COLLATION)

start:
    docker start $(CONTAINER)

stop:
    docker stop $(CONTAINER)

remove: stop 
    docker rm $(CONTAINER)

reset_hard: stop remove create start

reset: stop start

#DATABASE RELATED (build, create, populate DB)

define run_script
    docker cp $(1) $(CONTAINER):/tmp/
    docker exec -it $(CONTAINER) mysql -u root -psecret < /tmp/$(1)
    echo "$(cat $(1))"
endef

setup:
    $(call run_script,setup.sql)

create_tables:
    $(call run_script,create_tables.sql)

Команды, доставляющие мне неприятности:

make setup
make create_tables

Они оба дают мне «Нет такого файла или каталога». Даже если я запускаю их снаружи Makefile.

1 Ответ

0 голосов
/ 06 сентября 2018

Возможно, самый простой способ сделать это - создать каталог на хосте, содержащий два файла .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».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...