Hoe te detecteren of het uitvoeren van docker programmatisch is gelukt?

Ik schrijf een heel eenvoudig bash-script om snel te controleren of mijn container nog steeds correct wordt gebouwd en gestart en of de app erin reageert op verzoeken.

Soms mislukt de docker run, b.v. omdat de poort waaraan ik de container probeer te binden al is toegewezen. Maar wanneer dit gebeurt, is de exit-code van docker runnog steeds 0, dus ik kan de exit-code niet gebruiken. Hoe kan ik programmatisch controleren of de container correct is gestart?

De oplossingen die ik overweeg zijn:

  • ontleed de uitvoer op fouten
  • docker psom te zien of de container draait

maar deze lijken allebei een beetje overdreven en lelijk. Mis ik een betere manier om te controleren of docker runis geslaagd?


Antwoord 1, autoriteit 100%

Zoals gesuggereerd door Abel Muiño in opmerkingen, is dit mogelijk opgelost in recentere Docker-versies (ik gebruik momenteel 0.9.1).

Maar als je net als ik tijdelijk met een oudere versie vastzit, heb ik een goede oplossing gevonden om te controleren of de container is gestart door docker inspectte gebruiken.

docker inspectretourneert een JSON-object met veel informatie over de container, en in het bijzonder of de container momenteel actief is of niet. Met de vlag -fkun je eenvoudig de benodigde bits extraheren:

docker inspect -f {{.State.Running}} $CONTAINER_ID

of

docker inspect -f "{{.State.Running}}" $CONTAINER_ID

retourneert trueof false.

Houd er rekening mee dat u waarschijnlijk sleep 1(of meer) wilt slapen tussen het starten van de container en het controleren of deze aanstaat. Als er iets mis is met je setup, is het mogelijk dat deze heel korte tijd als ‘in werking’ lijkt voordat je daadwerkelijk afsluit.


Antwoord 2, autoriteit 18%

Om te voorkomen dat er iets wordt geparseerd, kunt u docker topgebruiken, dat 1 retourneert als de container niet actief is:

id=$(docker run mycontainer)
if ! docker top $id &>/dev/null
then
    echo "Container crashed unexpectedly..."
    return 1
fi

Antwoord 3, autoriteit 8%

We zouden docker exec $id true 2>/dev/null || echo not running.

Dit commando schrijft niet naar stdout, zoals “docker top” doet. Het schrijft naar stderr wanneer de container niet actief is, hetzelfde bericht als “docker top”.


Antwoord 4, autoriteit 2%

De bovengenoemde suggesties toepassen op een script.

1 – Maak een script keepMyDockerUp.sh:

vi keepMyDockerUp.sh
#!/bin/bash
Container_ID=INSERT_YOUR_CONTAINER_ID HERE
result=$( docker inspect -f {{.State.Running}} $Container_ID)
echo "result is" $result
if [ $result = "true" ]
then
echo "docker is already running"
else
systemctl restart docker
docker start $Container_ID
fi

2 – Voeg het dan gewoon toe aan cron, zodat uw script af en toe controleert of uw Docker-container up-to-date is:

crontab -e

Ga naar de laatste regel en voeg je scriptbestand toe. Bijvoorbeeld:

* * * * * /root/keepMyDockerUp.sh

3 – Sla crontab op en maak je nooit meer zorgen dat je Docker-container niet meer werkt.

Hopelijk helpt het…

😉


Antwoord 5

Ik moest gebruiken:

$ docker inspect -f {{.State.Health.Status}} xxx

(de container was actief, maar de service in de container was niet volledig gestart.

Een deel van de uitvoer inspecteren:

"State": {
    "Status": "running",
    "Running": true,
    "Paused": false,
    "Restarting": false,
    "OOMKilled": false,
    "Dead": false,
    "Pid": 1618,
    "ExitCode": 0,
    "Error": "",
    "StartedAt": "2019-03-08T10:39:24.061732398Z",
    "FinishedAt": "0001-01-01T00:00:00Z",
    "Health": {
        "Status": "starting",
        "FailingStreak": 0,
        "Log": []

Other episodes