我按照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();"
<<<
是一个Shell输入重定向符号,它将后面的内容作为标准输入提供给前面的命令。三个小于号表示将后面的内容视为“Here String”,它可以方便地将一个字符串作为输入传递给命令。为什么使用三个而不是两个,则是因为这是Bash Shell中规定的语法。 - vladkras通过bash进入正在运行的MySQL容器:
$ docker exec -t -i
container_mysql_name
/bin/bash
-i
是--interactive
选项的快捷方式。该选项用于保持标准输入开启,即使没有附加。
-t
是--tty
选项的快捷方式,用于分配伪终端。
从bash MySQL容器中运行MySQL客户端:
$ mysql -uroot -proot
-u
是--user=name
选项的快捷方式,用于定义登录用户(如果不是当前用户)。
-p
是-password[=name]
选项的快捷方式,用于定义连接到服务器时要使用的密码。如果未提供密码,则会从tty上询问。
docker exec -t -i container_mysql_name /bin/bash -c "mysql -uroot -proot"
。 - ocarlsen在我的情况下,<<<
解决方案无法工作。
相反,我使用了 -e
。
示例:
docker exec ${CONTAINER_NAME} mysql -u ${USER_NAME} -p${PASSWORD} -e "drop schema test; create schema test;"
docker exec -i mySqlContainer mysql -uroot -pmypassword < file.sql
(也许现在有点晚了,但对其他人可能有所帮助)。 - Dwhitz对于@Abdullah Jibaly的解决方案,在测试了MySQL 5.7后,它只会进入bash终端提示,您仍然需要再次输入mysql命令。
为了在使用一行命令运行MySQL容器后直接进入MySQL命令行客户端,请运行以下命令:
docker exec -it container_mysql_name mysql -u username -p
$ docker run -it --rm mysql mysql -h172.17.0.2 -uroot -pmy-secret-pw -e "show databases;"
mysql...
命令会覆盖图像的默认命令mysqld
。因此,容器中不会运行mysql,无法响应连接。 - undefined我使用以下命令来解决容器内外数据库的一些情况(使用-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
#!/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语法失败。
Richard
docker run --name <cotainer-name> -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
1. docker exec -it <cotainer-name> bash -l
2. mysql -n<username> -p<password>
-v ./mysql:/var/lib/mysql
或类似的内容,它将会持久化 - 但他没有这样做。请记住,这是使用普通的docker,而不是docker-compose(所以你看到的就是所有已定义的内容)。 :) - XtraSimplicity