如何从主机到容器 运行 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数据库。

  1. 我将 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

  2. 我 运行 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.

  3. Disco!

在我的例子中,<<< 解决方案不起作用。

相反,我使用了 -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 语法错误。

理查德