【问题标题】:How to execute MySQL command from the host to container running MySQL server?如何从主机执行 MySQL 命令到运行 MySQL 服务器的容器?
【发布时间】:2015-04-07 23:50:44
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

    标签: mysql docker linux-containers


    【解决方案1】:

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

    docker exec -it mysql bash -l
    

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

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

    【讨论】:

    • rpc 错误:code = 2 desc = oci 运行时错误:exec 失败:container_linux.go:247:启动容器进程导致“exec:\”-it\”:$PATH 中找不到可执行文件" 在您的解决方案中出现此错误。
    • 为什么说做了什么都不会坚持?这取决于其他参数(主要是实际数据库数据所在的位置 - 它是否使用卷安装到主机?)并且与 docker exec 无关。
    • @eyalzba,他没有在他的 docker 命令中挂载任何东西。如果他添加-v ./mysql:/var/lib/mysql 或类似名称,它将持续存在 - 但他没有。请记住,这是使用普通的 docker,而不是 docker-compose(所以您看到的就是所有已定义的内容)。 :)
    • @XtraSimplicity,你说的和我说的完全一样。我只是补充说我不知道​​他是否使用“-v”运行。
    • 这个工作完美 docker exec -it {{CONTAINER ID}} mysql -u {{USERNAME}} -p {{PASSWORD}}
    【解决方案2】:
    docker exec -i some_mysql_container mysql -uroot -ppassword  <<< "select database();"
    

    【讨论】:

    • &lt;&lt;&lt; 是什么意思?为什么 3 个不是 2 个?
    • '
    • 非常感谢。我正在研究如何创建一个别名以仅通过一个命令登录 mysql,这个答案帮助了我。正如@Andreas Volkmann 所解释的,在执行查询之前,我必须使用“-e”选项。 “
    【解决方案3】:

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

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

      $ docker exec -t -i 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. Disco!

    【讨论】:

    • 您可以像这样组合这些步骤:docker exec -t -i container_mysql_name /bin/bash -c "mysql -uroot -proot"
    【解决方案4】:

    就我而言,&lt;&lt;&lt; 解决方案不起作用。

    我使用了-e

    例子:

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

    【讨论】:

    • 我试图创建一个别名以仅通过一个命令登录 mysql,这个特殊的解决方案帮助了我。非常感谢。
    • 如何运行 .sql 文件而不是执行硬编码的 SQL 查询?
    【解决方案5】:

    @Abdullah Jibaly解决方案,在MySQL 5.7测试后,只会进入bash终端提示符,此时仍需第二次输入mysql命令。

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

    docker exec -it container_mysql_name mysql -u username -p
    

    【讨论】:

      【解决方案6】:

      我使用以下命令创建一个命令,该命令将解决至少几个容器外部或内部数据库的情况(使用-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
      

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

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

          理查德

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-05-12
            • 1970-01-01
            • 2020-11-26
            • 1970-01-01
            • 1970-01-01
            • 2015-10-21
            • 2019-03-21
            • 2020-07-28
            相关资源
            最近更新 更多