如何执行 MySQL 命令从主机到容器运行 MySQL 服务器?

我已经按照 https://registry.hub.docker.com/_/mysql/中的指令提取了一个映像并运行了一个容器,其中运行了一个 MySQL 服务器。

容器在后台运行,我想运行一些命令。

连接到容器并从命令行执行此命令的最佳方式是什么?

谢谢。

156619 次浏览

您可以连接到 mysql 容器并使用以下命令运行命令:

docker exec -it mysql bash -l

(其中 mysql是您给容器的名称)

请记住,您所做的任何操作都不会持续到下次从同一映像运行容器时。

docker exec -i some_mysql_container mysql -uroot -ppassword  <<< "select database();"

使用 MySQL 命令行客户端连接到 MySQL 数据库。

  1. 我将 bash 连接到正在运行的 MySQL 容器:

    $ docker exec -t -i < em > container_mysql_name /bin/bash

    -i --interactive选项的快捷方式。此选项用于保持 STDIN 打开,即使没有附加

    -t --tty选项的快捷方式,用于分配伪 TTY

  2. 我从 bash MySQL 容器运行 MySQL 客户端:

    $ mysql -uroot -proot

    -u --user=name选项的快捷方式,用于定义登录用户(如果不是当前用户)。

    -p -password[=name]选项的快捷方式,用于定义连接到服务器时使用的密码。如果没有给出密码,则从 tty 请求密码。

  3. 迪斯科!

在我的情况下,<<<解决方案没有工作。

取而代之的是 -e

例如:

docker exec ${CONTAINER_NAME} mysql -u ${USER_NAME} -p${PASSWORD} -e "drop schema test; create schema test;"

我使用以下命令来创建一个命令,该命令将使用容器外部或内部的数据库(使用 -h-P)和支持 -e的数据库对至少两个案例进行排序:

cat > ~/bin/mysql <<'EOF'
#/bin/bash


MARGS=()
MPORT="3306"


while test $# != 0; do
if [[ $1 == -h ]]; then MHOST=$2; shift;
elif [[ $1 == -h* ]]; then MHOST=${1#"-h"};
elif [[ $1 == -e ]]; then MEXEC=$2; shift;
elif [[ $1 == -e* ]]; then MEXEC=${1#"-e"};
elif [[ $1 == --execute=* ]]; then MEXEC=${1#"--execute="};
elif [[ $1 == -P ]]; then MPORT=$2; shift;
elif [[ $1 == -P* ]]; then MPORT=${1#"-P"};
else MARGS="$MARGS $1"
fi


shift;
done


if [ -z  "${MHOST+x}" ]; then
MHOST=localhost
fi


if [ $(docker inspect --format '\{\{ .State.Status }}' mysql) == "running" ]; then
if [ ! -z "${MHOST+x}" ]; then
if [ "$MHOST" == "localhost" -o "$MHOST" == "127.0.0.1" ]; then
CPORT=$(docker port mysql 3306/tcp)
if [ ${CPORT#"0.0.0.0:"} == $MPORT ]; then
#echo "aiming for container port ($MPORT -> $CPORT)";
MHOST=$(docker inspect --format '\{\{ .NetworkSettings.IPAddress }}' mysql);
else
MHOST=$(ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | head -1);
fi
fi
fi
fi


if [ -z "$MEXEC" ]; then
docker run --link mysql:mysql -i --rm mysql mysql "-h" $MHOST "-P" $MPORT $MARGS
else
docker run --link mysql:mysql -i --rm mysql mysql "-h" $MHOST "-P" $MPORT $MARGS <<< $MEXEC
fi
EOF
chmod +x ~/bin/mysql

对于 @ Abdullah Jibaly解决方案,在 MySQL 5.7中测试之后,它只会输入 bash 终端提示符,因此您仍然需要第二次输入 mysql 命令。

为了在用一行命令运行 MySQL 容器后直接进入 MySQL 命令行客户端,只需运行以下命令:

docker exec -it container_mysql_name mysql -u username -p

使用 去码头了可以启动一个新的容器来执行 mysql 语句。 当您尝试使用 localhost 连接到 mysql 并使用 docker exec 运行语句时,这种方法帮助我解决了 拒绝访问问题

$ docker run -it --rm mysql mysql -h172.17.0.2 -uroot -pmy-secret-pw -e "show databases;"

我没有发现这些解决方案中的任何一个对我的用例是有效的: 需要将返回的数据从 SQL 存储到 bash 变量中。

在主机上运行 bash 脚本(在 docker mysql 服务器之外)进行调用时,我使用了以下语法,基本上使用‘ echo’将 SQL 语句转发给 docker exec 命令中的 stdin。

修改以下内容以指定用例的 mysql 容器名称和适当的 mysql 用户名和密码:

#!/bin/bash
mysqlCMD="docker exec -i _mysql-container-name_ mysql -uroot -proot "
sqlCMD="select count(*) from DBnames where name = 'sampleDB'"
count=`echo $sqlCMD | $mysqlCMD | grep -v count`


# count variable now contains the result of the SQL statement

不管出于什么原因,当我使用-e 选项,然后在反引号中提供该字符串时,解释器修改了引号,导致 SQL 语法失败。

Richard