繁体   English   中英

在 shell 脚本中运行 MYSQL 命令不起作用

[英]Running MYSQL command inside a shell script not working

我正在尝试使用命令运行 shell 脚本以运行 Django 服务器。

#!/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

最好使用全系列容器 arguments 来初始化数据库,避免需要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会在某个时候被包含进来,以使这个过程更简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM