web-dev-qa-db-ja.com

ホストからmysqlサーバーを実行しているコンテナに対してmysqlコマンドを実行します

https://registry.hub.docker.com/_/mysql/ の指示に従って、イメージを取得し、mysqlサーバーを実行するコンテナーを実行しました。コンテナはバックグラウンドで実行されており、いくつかのコマンドを実行します。コンテナに接続し、コマンドラインからこのコマンドを実行する最良の方法はどれですか?

24
Mazzy

Mysqlコンテナに接続し、次を使用してコマンドを実行できます。

docker exec -it mysql bash -l

mysqlはコンテナに付けた名前です)

同じイメージからコンテナを次に実行するとき、何をしても永続化されないことに注意してください。

40
Abdullah Jibaly
docker exec -i some_mysql_container mysql -uroot -ppassword  <<< "select database();"
23
Laurent Picquet

MySQLコマンドラインクライアントを使用してMySQLデータベースに接続するには。

  1. 実行中のMySQLコンテナーにbashに接続します。

    $ docker exec -t -icontainer_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. ディスコ

14
Nolwennig

@ Abdullah Jibalyソリューションの場合、MySQL 5.7でテストした後、bashターミナルプロンプトにのみ入力されるため、mysqlコマンドを2回入力する必要があります。

1行のコマンドでMySQLコンテナーを実行した後、MySQLコマンドラインクライアントに直接入力するには、次を実行します。

docker exec -it container_mysql_name mysql -u username -p
3
Jerry Chong

以下を使用して、コンテナの外部または内部のデータベース(-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
2
Gustaf Naeser

私の場合、<<<ソリューションは機能しませんでした。

代わりに-eを使用しました。

例:

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

1