Auf einem Jenkins-Computer möchte ich nur dann einen Docker-Container mit einem angegebenen Namen erstellen, wenn dieser noch nicht vorhanden ist (in einem Shell-Skript). Ich dachte, ich könnte den Befehl ausführen, um den Container unabhängig davon zu erstellen und den Fehler zu ignorieren, falls es einen gibt, aber dies führt dazu, dass mein Jenkins-Job fehlschlägt.
Daher möchte ich wissen, wie ich überprüfen kann, ob ein Docker-Container vorhanden ist oder nicht.
-a
oder der Versuch, einen verlassenen Container auszuführen, schlägt fehl.Schätze ich
seit Docker Container Inspect Call wird $ setzen? auf 1, wenn der Container nicht vorhanden ist (nicht inspiziert werden kann), aber auf 0, wenn er vorhanden ist (dies gilt für gestoppte Container). Der Befehl run wird also nur aufgerufen, falls der Container nicht wie erwartet vorhanden ist.
quelle
docker container inspect <container-name> > /dev/null 2>&1
erfolgreiche und erfolglose Ausgabe verwerfen.Sie können verwenden
filter
undformat
Optionen fürdocker ps
Befehl zu vermeiden Rohrleitungen mit Unix - Werkzeugen wiegrep
,awk
usw.name='nginx' [[ $(docker ps --filter "name=^/$name$" --format '{{.Names}}') == $name ]] || docker run -d --name mynginx <nginx-image>
quelle
--filter "name=^/$name$"
$
benötigt wird.Stellen Sie dem Namen einfach ^ / voran und dem Suffix $. Es scheint, dass es ein regulärer Ausdruck ist:
CONTAINER_NAME='mycontainername' CID=$(docker ps -q -f status=running -f name=^/${CONTAINER_NAME}$) if [ ! "${CID}" ]; then echo "Container doesn't exist" fi unset CID
quelle
Noch kürzer mit Docker-Top :
docker top
Gibt einen Wert ungleich Null zurück, wenn keine Container vorhanden sind, die dem ausgeführten Namen entsprechen. Andernfalls werden die PID, der Benutzer, die Laufzeit und der Befehl zurückgegeben.quelle
Robuster Grep
^$
ohne undokumentiertes VerhaltenDies ist der präziseste und flexibelste Ansatz, den ich finden konnte:
container_name=mycont if sudo docker ps -a --format '{{.Names}}' | grep -Eq "^${container_name}\$"; then echo exists else echo 'does not exist' fi
Begründung:
docker container inspect
und das-f name
erfordert reguläre Ausdrücke einiger nett.Python
Eine Python-Version, da ich sie letztendlich in einem Projekt verwendet habe:
containers = subprocess.check_output([ 'sudo', 'docker', 'ps', '-a', '--format', '{{.Names}}', ]).decode() if container_name in containers.split(): # Exists.
quelle
Ich verwende folgenden Code, um festzustellen, ob ein Docker-Container vorhanden ist:
CONTAINER_NAME='my_docker_container' # Checking if docker container with $CONTAINER_NAME name exists. COUNT=$(docker ps -a | grep "$CONTAINER_NAME" | wc -l) if (($COUNT > 0)); then echo 'container exists' fi
quelle
ps -a
Übereinstimmungsfelder nicht benötigt werden und nicht benötigt werdenwc
, kann der grep-Status direkt verwendet werden. Meine Version leidet nicht unter diesen Problemen: stackoverflow.com/a/50841982/895245Dies ist meine Lösung, um nach einem laufenden Container zu suchen, ihn anzuhalten und dann zu entfernen.
CNAME=$CONTAINER_NAME-$CODE_VERSION if [ "$(docker ps -qa -f name=$CNAME)" ]; then echo ":: Found container - $CNAME" if [ "$(docker ps -q -f name=$CNAME)" ]; then echo ":: Stopping running container - $CNAME" docker stop $CNAME; fi echo ":: Removing stopped container - $CNAME" docker rm $CNAME; fi
Ich musste zu oft danach suchen, weil selbst die Antwort über 100 oben nicht funktioniert. Ich denke, der Grund ist ein Missverständnis über Docker ps.
docker ps
listet RUNNING-Container auf.docker ps -q
macht dasselbe, aber die Ausgabe ist so gestreift, dass sie nur die container_id enthält.docker ps -a
listet ALLE Container auf (laufend oder nicht).docker ps -qa
Dann ist eine einfache Liste aller Container, währenddocker ps -q
es eine einfache Liste der laufenden Container ist.docker ps -q -f name=ContainerName
ist dann eine einfache Liste laufender Container mit dem Namen ContainerName.docker ps -qa -f
würde auch verlassene Container einschließen, daher muss die Logik darin bestehen, -a (dort, läuft oder nicht) und dann -a zu überprüfen, um festzustellen, ob es nicht nur dort ist, sondern auch läuft (und zuerst gestoppt werden muss).quelle
if [[ $(sudo docker inspect --format . <container-name>) == "." ]]; then docker run <container-name>; fi
Erklärung :
Es gibt bereits eine ähnliche Antwort. Der Unterschied ist hier die
--format .
Option (Sie können auch verwenden-f .
). Dadurch werden alle Details aus dem Befehl inspect entfernt. Docker verwendet das go-Vorlagenformat. In diesem Fall wird alles, was nicht erkannt wird, in die Ausgabe kopiert.So
-f itIsThere
kehrt ,itIsThere
wenn ein Behälter mit , dass Namex beendet. Ist dies nicht der Fall, gibt Docker einen Fehlercode und eine Meldung (Error: No such object: <container-name>
) zurück.Ich habe diesen in Jenkins Protokollen gefunden.
quelle
Huckepack von @Fernando César.
Dies prüft die Container-ID anhand des angegebenen Containernamens und unterdrückt die Fehlerausgabe (
2> /dev/null
).CONTAINER_NAME="awesome-container" CONTAINER_ID=$(docker inspect --format="{{.Id}}" ${CONTAINER_NAME} 2> /dev/null) if [[ "${CONTAINER_ID}" ]]; then # container found. else # container not found. fi
quelle
Im Bash-Skript überprüfe ich, ob der Container mit folgendem Namen existiert:
CONTAINER_NAME="my-container-name" if ! docker container ls -a | grep -Fq "$CONTAINER_NAME" 1>/dev/null; then echo "could not found container $CONTAINER_NAME..." fi
quelle