
Моя цель — запустить несколько команд в моем Dockerfile, которые создадут пользователя sql и предоставят ему некоторые привилегии. Поэтому я делаю следующее:
FROM ubuntu:18.04
...
RUN apt-get install -y apache2
RUN apt-get install -y mysql-server
RUN mysql -Bse "CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'testpass';"
RUN mysql -Bse "GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'localhost';"
Это приводит к сбою при первой же команде mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Однако если через StackExchange будет обнаружено, что если я удалю команды SQL из Dockerfile и войду в работающий контейнер с помощью docker exec, то следующее решение будет работать:
service apache2 stop
service mysql stop
service mysql start
service apache2 start
mysql -Bse "CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'testpass';"
mysql -Bse "GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'localhost';"
Поскольку я хочу, чтобы все команды были в Dockerfile, я попробовал service stop/start
решение выше, но оно не будет работать из Dockerfile, только после exec в уже запущенном контейнере. Я полагаю, что требуется другое решение.
Как я могу автоматизировать выполнение этих команд sql без необходимости запускать их вручную с помощью docker exec? Спасибо
P.S. Дайте мне знать, если вопрос больше подойдет для другого сайта Stack Exchange.
решение1
Проблема связана с тем, что каждая команда RUN выполняется в другом слое. Решением было добавить все связанные команды в файл bash-скрипта init_db.sh и выполнить его в Dockerfile.
#!/bin/bash
service apache2 stop
service mysql stop
service mysql start
service apache2 start
mysql -Bse "CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'testpass';"
mysql -Bse "GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'localhost';"
ADD init_db.sh /tmp/init_db.sh
RUN /tmp/init_db.sh
источник:https://stackoverflow.com/questions/25920029/setting-up-mysql-and-importing-dump-within-dockerfile