Я выполнил инструкцию https://registry.hub.docker.com/_/mysql/, чтобы вытащить изображение и запустить контейнер, в котором он запускает сервер mysql. Контейнер работает в фоновом режиме, и я буду запускать некоторые команды. Каков наилучший способ подключения к контейнеру и выполнить эту команду из командной строки?
Выполнить команду mysql от хоста к контейнеру, на котором запущен сервер mysql
Ответ 1
Вы можете подключиться к контейнеру mysql и запустить свои команды, используя:
docker exec -it mysql bash -l
(Где mysql - имя, которое вы дали контейнеру)
Имейте в виду, что все, что вы делаете, не будет сохраняться в следующий раз, когда вы запустите контейнер с одного и того же изображения.
Ответ 2
docker exec -i some_mysql_container mysql -uroot -ppassword <<< "select database();"
Ответ 3
Для подключения к базе данных MySQL используется клиент командной строки MySQL.
-
Я подключаюсь к bash в работающий контейнер MySQL:
$ docker exec -t -icontainer_mysql_name/bin/bash-iявляется ярлыком для--interactiveопции. Эта опция используется для сохранения STDIN открытым, даже если он не подключен-tявляется сокращением для--tty, используемой для выделения псевдо -t TY -
Я запускаю клиент MySQL из контейнера MySQL для bash:
$ mysql -uroot -proot-uявляется сокращением для--user=nameопция, используемая для определения пользователя для входа в систему, если не текущий пользователь.-p- это ярлык для-password[=name], используемый для определения пароля, который будет использоваться при подключении к серверу. Если пароль не указан, он запрашивается у tty.
Ответ 4
Для решения @Abdullah Jibaly, после тестирования в MySQL 5.7, оно будет введено только в приглашение терминала bash, в результате чего вам все равно нужно будет ввести команду mysql во второй раз.
Чтобы напрямую войти в клиент командной строки MySQL после запуска контейнера MySQL одной строкой команды, просто выполните следующее:
docker exec -it container_mysql_name mysql -u username -p
Ответ 5
Я использую следующее для создания команды, которая разберет по крайней мере пару случаев с базами данных снаружи или внутри контейнера (с -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
Ответ 6
В моем случае решение <<< не сработало.
Вместо этого я использовал -e.
Пример:
docker exec ${CONTAINER_NAME} mysql -u ${USER_NAME} -p${PASSWORD} -e "drop schema test; create schema test;"
Ответ 7
Это возможно с помощью docker run, запустить новый контейнер только для выполнения вашего оператора mysql. Этот подход помог мне обойти проблему отказа в доступе, когда вы пытаетесь запустить оператор с помощью docker exec, используя localhost для подключения к mysql
$ docker run -it --rm mysql mysql -h172.17.0.2 -uroot -pmy-secret-pw -e "show databases;"