【问题标题】:Running MYSQL command inside a shell script not working在 shell 脚本中运行 MYSQL 命令不起作用
【发布时间】:2021-10-23 01:16:51
【问题描述】:

我正在尝试运行带有命令的 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 顺便说一句。

谢谢

【问题讨论】:

    标签: mysql django linux shell mariadb


    【解决方案1】:

    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 container test script

    希望MDEV-25434 HEALTHCHECK 会在某个时候加入,以简化此过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-08
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多