Запуск команды MYSQL внутри сценария оболочки не работает
Я пытаюсь запустить сценарий оболочки с командами для запуска Django Server.
#!/bin/bash
docker run -e MYSQL_ROOT_PASSWORD=root --name db_name -d mariadb
docker exec -it container_name mysql -u root -proot -e "create database db_name CHARACTER SET UTF8; CREATE USER invuser@XXX.17.0.3 IDENTIFIED BY 'root1234$'; GRANT ALL PRIVILEGES ON db_name .* TO invuser@XXX.17.0.3 IDENTIFIED BY 'root1234$';"
#mysql -u root -proot -e "create database db_name CHARACTER SET UTF8; CREATE USER invuser@XXX.17.0.3 IDENTIFIED BY 'root1234$'; GRANT ALL PRIVILEGES ON db_name .* TO invuser@XXX.17.0.3 IDENTIFIED BY 'root1234$'"
echo "Docker image name will be $1"
python3 manage.py makemigrations
python3 manage.py migrate
docker build . -t $1
docker run -d -p 8000:8000 $1
В этом скрипте, когда я пытаюсь запустить :
docker exec -it container_name mysql -u root -proot -e "create database db_name CHARACTER SET UTF8; CREATE USER invuser@XXX.17.0.3 IDENTIFIED BY 'root1234$'; GRANT ALL PRIVILEGES ON db_name .* TO invuser@XXX.17.0.3 IDENTIFIED BY 'root1234$';"
Я получаю эту ошибку :
ERROR 2002 (HY000): Can't connect to local server through socket '/run/mysqld/mysqld.sock' (2)
ИЛИ когда я запускаю :
mysql -u root -proot -e "create database db_name CHARACTER SET UTF8; CREATE USER invuser@XXX.17.0.3 IDENTIFIED BY 'root1234$'; GRANT ALL PRIVILEGES ON db_name .* TO invuser@XXX.17.0.3 IDENTIFIED BY 'root1234$'"
Я получаю эту ошибку:
ERROR 2002 (HY000): Can't connect to MySQL server on 'XXX.17.0.2' (115)
Но когда я запускаю эту команду из скрипта, вручную, она работает как ожидалось и создает базу данных и пользователя тоже.
Может ли кто-нибудь предложить лучший способ реализовать это через скрипт? Я использую Centos 7.
Спасибо
Выполняется docker exec
до полной инициализации контейнера.
Лучше использовать полный набор аргументов контейнера для инициализации базы данных и избежать необходимости docker exec
:
docker run -d --name db_name \
-e MARIADB_DATABASE=db_name \
-e MARIADB_USER=invuser \
-e MARIADB_PASSWORD='root1234$' \
mariadb
Если вам нужен строго пользователь invuser@XXX.17.0.3
, вы можете поместить RENAME USER invuser@'%' TO invuser@'XXX.17.0.3'
в /docker-entrypoint-initdb.d/rename.sql
sql файл, передаваемый томом.
Подождать, пока сервер будет запущен:
cid=db_name
waiting=${DOCKER_LIBRARY_START_TIMEOUT:-10}
echo "waiting to start..."
while [ $waiting -gt 0 ]
do
(( waiting-- ))
sleep 1
if ! docker exec -i $cid mysql -h localhost --protocol tcp -P 3306 -e 'select 1' 2>&1 | fgrep "Can't connect" > /dev/null
then
break
fi
done
if [ $waiting -eq 0 ]
then
echo 'timeout'
exit 1
fi
Зацикливается до тех пор, пока не появится TCP-соединение.
источник: скрипт тестирования контейнера mariadb.
Надеюсь, что MDEV-25434 HEALTHCHECK когда-нибудь будет включен, чтобы упростить этот процесс.