Выполнить команду mysql от хоста к контейнеру, на котором запущен сервер mysql

Я выполнил инструкцию https://registry.hub.docker.com/_/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.

  1. Я подключаюсь к bash в работающий контейнер MySQL:

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

    -i является ярлыком для --interactive опции. Эта опция используется для сохранения STDIN открытым, даже если он не подключен

    -t является сокращением для --tty, используемой для выделения псевдо -t TY

  2. Я запускаю клиент MySQL из контейнера MySQL для bash:

    $ mysql -uroot -proot

    -u является сокращением для --user=name опция, используемая для определения пользователя для входа в систему, если не текущий пользователь.

    -p - это ярлык для -password[=name], используемый для определения пароля, который будет использоваться при подключении к серверу. Если пароль не указан, он запрашивается у tty.

  3. Дискотека !

Ответ 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;"