我已按照https://registry.hub.docker.com/_/mysql/中的说明提取图像并运行一个容器,在该容器中运行 MySQL 服务器。
容器在后台运行,我想运行一些命令。
连接到容器并从命令行执行此命令的最佳方式是什么?
谢谢。
我已按照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();"
我将 bash 连接到正在运行的 MySQL 容器中:
$ docker exec -t -i
container_mysql_name
/bin/bash
-i
是选项的快捷方式--interactive
。此选项用于保持 STDIN 打开,即使未连接
-t
是--tty
option 的快捷方式,用于分配伪 TTY
我从 bash MySQL 容器运行 MySQL 客户端:
$ mysql -uroot -proot
-u
是--user=name
选项的快捷方式,如果不是当前用户,则用于定义登录用户。
-p
是-password[=name]
选项的快捷方式,用于定义连接服务器时使用的密码。如果没有给出密码,则从 tty 询问。
迪斯科!
就我而言,<<<
解决方案不起作用。
相反,我使用了-e
.
例子:
docker exec ${CONTAINER_NAME} mysql -u ${USER_NAME} -p${PASSWORD} -e "drop schema test; create schema test;"
对于@Abdullah Jibaly解决方案,在MySQL 5.7中测试后,它只会进入 bash 终端提示符,因此您仍然需要第二次输入 mysql 命令。
为了在一行命令运行 MySQL 容器后直接进入 MySQL 命令行客户端,只需运行以下命令:
docker exec -it container_mysql_name mysql -u username -p
我使用以下命令创建一个命令,该命令将整理出至少几个与容器外部或内部的数据库(使用-h
and -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
可以使用docker run启动一个新容器来执行您的 mysql 语句。当您尝试使用 docker exec 使用 localhost 连接到 mysql 运行语句时,这种方法帮助我解决了访问被拒绝的问题
$ 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 命令上的标准输入。
修改以下内容,为您的用例指定 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 语法失败。
理查德