Używam docker-compose
.
Niektóre polecenia podoba up -d service_name
lub start service_name
wracają od razu i to dość przydatne, jeśli nie chcesz pojemniki uruchomione zależy od stanu powłoki, jak robią z regularnym up service_name
. Jedynym przypadkiem użycia jest uruchomienie go z pewnego rodzaju serwera ciągłej integracji / dostarczania.
Ale ten sposób uruchamiania / uruchamiania usług nie zapewnia żadnej informacji zwrotnej na temat faktycznego stanu usługi później.
Odniesienia Docker Compose CLI dla up
komendy wspomina odpowiednią opcję, ale, jak dla wersji 1.7.1
, to wzajemnie wykluczające się z -d
:
--abort-on-container-exit Stops all containers if any container was stopped. *Incompatible with -d.*
Czy mogę w jakiś sposób ręcznie sprawdzić, czy kontener rzeczywiście działa i czy nie zatrzymał się z powodu błędu?
źródło
docker ps -q -f "status=running" --no-trunc | grep $(docker-compose ps -q <service_name>)
grep ....
część kończy się pustym ciągiem.if [ -z `docker-compose ps -q mysql` ] || [ -z `docker ps -q --no-trunc | grep $(docker-compose ps -q mysql)` ]; then
. To robi: najpierw sprawdza, czy usługa w ogóle istnieje (nawet jeśli jest zatrzymana), a druga część sprawdza, czy istniejąca usługa faktycznie działa. Możesz dołączyć to do swojego przykładu dla przyszłych czytelników, którzy przeglądają tylko zaakceptowaną odpowiedź. Myślę, że to jest przydatne.Jeśli chodzi o wersję
1.7.1
, nie ma takich poleceń wbudowanych.Zamiast tego
exec
można użyć w podobny sposób.Po uruchomieniu go dla usługi, która ma kilka kontenerów, będzie działał poprawnie:
Ale gdy uruchomisz go dla usługi, która nie ma uruchomionych kontenerów usług , wyświetli błąd:
Można go więc wykorzystać do sprawdzenia, czy istnieją jakieś „żywe” pojemniki dla danej usługi.
źródło
Możesz uruchomić:
Otrzymasz identyfikator kontenera, jeśli
service-name
jest uruchomiony. Coś jak:Jeśli usługa nie działa, dane wyjściowe są puste, więc jeśli chcesz użyć tego w skrypcie, możesz zrobić coś takiego:
źródło
docker-compose up
Ctrl-C.docker-compose ps
powinien wtedy pokazać, że stany kontenera nie są „w górę”, aledocker-compose ps -q service-name
nadal dają ci identyfikator.Miałem podobną potrzebę. Mam jednak
restart: always
w swoim środowisku. Może być więc trochę trudne wykrycie, czy coś się zawiesza i restartuje w pętli.Zrobiłem kontrolę Icinga / Nagios, aby również porównać czasy utworzenia i rozpoczęcia. Może przyda się komuś innemu:
źródło
Jeśli przyjmiesz ten scenariusz:
można sprawdzić, czy nie ma żadnego pojemnika zatrzymane z powodu błędu z:
docker ps -a | grep 'Exited (255)'
.Ta kontrola działa poprawnie nawet w przypadku kontenerów, które mają się natychmiast zatrzymać bez błędu (tj. Pojemniki danych), ponieważ ich status (od
docker ps -a
) jest oznaczony jakoExited (0)
.Na przykład w naszym docker-compose.yml zaczynamy nasze kontenery od:
command: sh -c 'node dotenv_check.js && pm2 start --no-daemon src/worker.js --watch'
Do php-fpm używamy podobnego polecenia:
dotenv_check.js
Idotenv_check.php
są skrypty, które wyjście z kodem błędu w przypadku, gdy wymagana zmienna ENV brakuje.set -e
Polecenia informuje skrypt do zatrzymania w przypadku błędu, który, z kolei, będą natychmiast zatrzymać pojemnik. Informacje o set-eźródło
Co powiesz na to?
wyświetlasz listę procesów, wybierasz wiersze, w których „kolumna” znajduje się w kolumnie 4, i filtrujesz w celu znalezienia dopasowania w nazwie usługi.
źródło