Я выполнил инструкцию 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 -i
container_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;"