59

我已按照https://registry.hub.docker.com/_/mysql/中的说明提取图像并运行一个容器,在该容器中运行 MySQL 服务器。

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

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

谢谢。

4

8 回答 8

91

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

docker exec -it mysql bash -l

mysql你给容器起的名字在哪里)

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

于 2015-02-08T05:21:40.700 回答
44
docker exec -i some_mysql_container mysql -uroot -ppassword  <<< "select database();"
于 2016-09-27T09:27:07.217 回答
34

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

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

    $ docker exec -t -i container_mysql_name /bin/bash

    -i是选项的快捷方式--interactive。此选项用于保持 STDIN 打开,即使未连接

    -t--ttyoption 的快捷方式,用于分配伪 TTY

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

    $ mysql -uroot -proot

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

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

  3. 迪斯科

于 2017-12-14T13:33:21.817 回答
18

就我而言,<<<解决方案不起作用。

相反,我使用了-e.

例子:

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

于 2018-12-17T02:14:08.220 回答
16

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

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

docker exec -it container_mysql_name mysql -u username -p
于 2019-06-15T09:46:27.693 回答
2

我使用以下命令创建一个命令,该命令将整理出至少几个与容器外部或内部的数据库(使用-hand -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
于 2019-03-19T16:19:44.817 回答
2

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

$ docker run -it --rm mysql mysql -h172.17.0.2 -uroot -pmy-secret-pw -e "show databases;"
于 2019-10-08T01:03:00.353 回答
1

我没有发现任何这些解决方案对我的用例有效:需要将返回的数据从 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 语法失败。

理查德

于 2020-01-01T16:02:20.843 回答