Запуск команды 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 когда-нибудь будет включен, чтобы упростить этот процесс.

Вернуться на верх