wake-up-neo.net

Führen Sie den mysql-Befehl vom Host aus in einen Container, auf dem der mysql-Server ausgeführt wird

Ich habe die Anweisung https://registry.hub.docker.com/_/mysql/ befolgt, um ein Image zu ziehen und einen Container auszuführen, in dem ein MySQL-Server ausgeführt wird. Der Container läuft im Hintergrund und ich würde einige Befehle ausführen. Was ist der beste Weg, um sich mit dem Container zu verbinden und diesen Befehl von der Kommandozeile aus auszuführen?

19
Mazzy

Sie können eine Verbindung zu Ihrem Mysql-Container herstellen und Ihre Befehle folgendermaßen ausführen:

docker exec -it mysql bash -l

(Dabei ist mysql der Name, den Sie dem Container gegeben haben.)

Denken Sie daran, dass alles, was Sie tun, beim nächsten Ausführen eines Containers mit demselben Image nicht bestehen bleibt.

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

So stellen Sie über den MySQL-Befehlszeilenclient eine Verbindung zur MySQL-Datenbank her.

  1. Ich verbinde mich mit der Bash im laufenden MySQL-Container:

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

  2. Ich führe MySQL-Client aus dem bash MySQL-Container aus:

    $ mysql -uroot -proot

  3. Disko !

12
Nolwennig

Für die @ Abdullah Jibaly -Lösung wurde sie nach dem Testen in MySQL 5.7 nur in die Bash-Terminal-Eingabeaufforderung eingegeben, wobei Sie den Befehl mysql noch ein zweites Mal eingeben müssen.

Um direkt in den MySQL-Befehlszeilen-Client zu gelangen, nachdem der MySQL-Container mit einer Befehlszeile ausgeführt wurde, führen Sie einfach Folgendes aus:

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

Ich benutze das Folgende, um einen Befehl zu erstellen, der mindestens einige Fälle mit Datenbanken außerhalb oder innerhalb des Containers aussortiert (mit -h und -P) und unterstütze -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

In meinem Fall funktionierte die <<<-Lösung nicht. 

Stattdessen habe ich -e verwendet.

Beispiel:

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

0