如何从主机到容器 运行 MySQL 服务器执行 MySQL 命令?
How to execute MySQL command from the host to container running MySQL server?
我已按照 https://registry.hub.docker.com/_/mysql/ 中的说明提取图像并 运行 设置一个容器,其中 运行 是一个 MySQL 服务器。
容器 运行正在后台运行,我想 运行 一些命令。
连接到容器并从命令行执行此命令的最佳方式是什么?
谢谢。
您可以使用以下方式连接到您的 mysql 容器和 运行 您的命令:
docker exec -it mysql bash -l
(其中 mysql
是您为容器指定的名称)
请记住,您所做的任何事情都不会持续到下一次 运行 来自同一图像的容器。
docker exec -i some_mysql_container mysql -uroot -ppassword <<< "select database();"
使用MySQL命令行客户端连接到MySQL数据库。
我将 bash 连接到 运行ning MySQL 容器中:
$ docker exec -t -i
container_mysql_name
/bin/bash
-i
is the shortcut for --interactive
option. This options is used for keep STDIN open even if not attached
-t
is the shortcut for --tty
option, used to allocate a pseudo-TTY
我 运行 MySQL 来自 bash MySQL 容器的客户端:
$ mysql -uroot -proot
-u
is shortcut for --user=name
option, used to define user for login if not current user.
-p
is shortcut for -password[=name]
option, used to define password to use when connecting to server. If password is not given it's asked from the tty.
在我的例子中,<<<
解决方案不起作用。
相反,我使用了 -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 [[ == -h ]]; then MHOST=; shift;
elif [[ == -h* ]]; then MHOST=${1#"-h"};
elif [[ == -e ]]; then MEXEC=; shift;
elif [[ == -e* ]]; then MEXEC=${1#"-e"};
elif [[ == --execute=* ]]; then MEXEC=${1#"--execute="};
elif [[ == -P ]]; then MPORT=; shift;
elif [[ == -P* ]]; then MPORT=${1#"-P"};
else MARGS="$MARGS "
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]*).*//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
可以使用 docker 运行,启动一个新容器来执行您的 mysql 语句。
这种方法帮助我解决了 access denied 问题,当你尝试 运行 一个带有 docker exec 的语句使用 localhost 连接到 mysql
$ docker run -it --rm mysql mysql -h172.17.0.2 -uroot -pmy-secret-pw -e "show databases;"
我没有发现任何这些解决方案对我的用例有效:需要将从 SQL 返回的数据存储到 bash 变量。
我在主机上(在 docker mysql 服务器之外)的 bash 脚本 运行 中进行调用时,最终得到以下语法,基本上使用 'echo' 将 SQL 语句转发到 docker exec 命令上的标准输入。
修改以下内容以指定 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 语法错误。
理查德
我已按照 https://registry.hub.docker.com/_/mysql/ 中的说明提取图像并 运行 设置一个容器,其中 运行 是一个 MySQL 服务器。
容器 运行正在后台运行,我想 运行 一些命令。
连接到容器并从命令行执行此命令的最佳方式是什么?
谢谢。
您可以使用以下方式连接到您的 mysql 容器和 运行 您的命令:
docker exec -it mysql bash -l
(其中 mysql
是您为容器指定的名称)
请记住,您所做的任何事情都不会持续到下一次 运行 来自同一图像的容器。
docker exec -i some_mysql_container mysql -uroot -ppassword <<< "select database();"
使用MySQL命令行客户端连接到MySQL数据库。
我将 bash 连接到 运行ning MySQL 容器中:
$ docker exec -t -i
container_mysql_name
/bin/bash
-i
is the shortcut for--interactive
option. This options is used for keep STDIN open even if not attached-t
is the shortcut for--tty
option, used to allocate a pseudo-TTY我 运行 MySQL 来自 bash MySQL 容器的客户端:
$ mysql -uroot -proot
-u
is shortcut for--user=name
option, used to define user for login if not current user.-p
is shortcut for-password[=name]
option, used to define password to use when connecting to server. If password is not given it's asked from the tty.
在我的例子中,<<<
解决方案不起作用。
相反,我使用了 -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 [[ == -h ]]; then MHOST=; shift;
elif [[ == -h* ]]; then MHOST=${1#"-h"};
elif [[ == -e ]]; then MEXEC=; shift;
elif [[ == -e* ]]; then MEXEC=${1#"-e"};
elif [[ == --execute=* ]]; then MEXEC=${1#"--execute="};
elif [[ == -P ]]; then MPORT=; shift;
elif [[ == -P* ]]; then MPORT=${1#"-P"};
else MARGS="$MARGS "
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]*).*//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
可以使用 docker 运行,启动一个新容器来执行您的 mysql 语句。 这种方法帮助我解决了 access denied 问题,当你尝试 运行 一个带有 docker exec 的语句使用 localhost 连接到 mysql
$ docker run -it --rm mysql mysql -h172.17.0.2 -uroot -pmy-secret-pw -e "show databases;"
我没有发现任何这些解决方案对我的用例有效:需要将从 SQL 返回的数据存储到 bash 变量。
我在主机上(在 docker mysql 服务器之外)的 bash 脚本 运行 中进行调用时,最终得到以下语法,基本上使用 'echo' 将 SQL 语句转发到 docker exec 命令上的标准输入。
修改以下内容以指定 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 语法错误。
理查德