103 votes

Comment exécuter une commande Bash uniquement si un conteneur Docker avec un prénom n'existe pas?

Sur un Jenkins machine, je voudrais créer un menu fixe récipient avec un nom spécifié que si elle n'existe pas déjà (dans un script shell). J'ai pensé que je pourrais exécuter la commande pour créer le conteneur indépendamment et ignorer l'erreur si il y en avait un, mais cela ne cause de mon jenkins échec du travail.

Donc, je voudrais savoir comment je peux vérifier si un conteneur docker existe ou non à l'aide de bash.

176voto

ferdy Points 26

Vous pouvez vérifier la non-existence de l'exécution d'un conteneur par grepping pour un <name> et de feu plus tard, comme ceci:

[ ! "$(docker ps -a | grep <name>)" ] && docker run -d --name <name> <image>

Mieux:

Faire usage de https://docs.docker.com/engine/reference/commandline/ps/ et vérifier si l'un est sorti de blocs de conteneur, de sorte que vous pouvez le supprimer en premier avant d'exécuter le conteneur:

if [ ! "$(docker ps -q -f name=<name>)" ]; then
    if [ "$(docker ps -aq -f status=exited -f name=<name>)" ]; then
        # cleanup
        docker rm <name>
    fi
    # run your container
    docker run -d --name <name> my-docker-image
fi

43voto

WiRai Points 81

Je suppose

docker container inspect <container-name> || docker run...

depuis conteneur docker inspecter appel sera défini $? à 1 si le contenant n'existe pas (ne peut pas vérifier), mais à 0 s'il n'existe pas (ce qui respecte cessé de conteneurs). Si l'exécution de la commande sera simplement appelé dans le cas où le conteneur n'existe pas comme prévu.

32voto

anubhava Points 172509

Vous pouvez utiliser filter et format des options pour l' docker ps de commande pour éviter de tuyauterie avec des utilitaires unix comme grep, awk etc.

name='nginx'

[[ $(docker ps --filter "name=^/$name$" --format '{{.Names}}') == $name ]] ||
docker run -d --name mynginx <nginx-image>

16voto

yucer Points 171

Juste préfixe le nom à ^/ et le suffixe avec $. Il semble que c'est une expression régulière:

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

2voto

Aliaksei Maniuk Points 616

Je utiliser le code suivant pour déterminer si le conteneur docker existe:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X