[英]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.