TL-DR
docker ps --no-trunci docker inspect CONTAINERpodaj punkt wejścia wykonany w celu uruchomienia kontenera, zgodnie z przekazaną komendą, ale może to spowodować pominięcie niektórych części, np. ${ANY_VAR}ponieważ zmienne środowiskowe kontenera nie są drukowane jako rozwiązane.
Aby temu zaradzić, docker inspect CONTAINERma tę zaletę, że pozwala również pobierać osobno zmienne env i ich wartości zdefiniowane w kontenerze z Config.Envwłaściwości.
docker psi docker inspectpodać informacje o wykonanym punkcie wejścia i jego poleceniu. Często jest to skrypt punktu wejścia opakowania ( .sh), a nie „prawdziwy” program uruchamiany przez kontener. Aby uzyskać informacje na ten temat, należy poprosić o informacje dotyczące procesu pslub /proc/1/cmdlinepomóc.
1) docker ps --no-trunc
Wyświetla punkt wejścia i polecenie wykonane dla wszystkich działających kontenerów. Chociaż wypisuje polecenie przekazane do punktu wejścia (jeśli go przekażemy), nie wyświetla wartości zmiennych enkera dokowania (takich jak $FOOlub ${FOO}).
Jeśli nasze kontenery używają zmiennych env, może to nie wystarczyć.
Na przykład uruchom kontener alpejski:
docker run --name alpine-example -e MY_VAR=/var alpine:latest sh -c 'ls $MY_VAR'
Gdy używasz dokera -ps, takiego jak:
docker ps -a - nazwa filtra = alpine-example --no-trunc
Drukuje:
ID KONTENERA OBRAZ KOMUNIKAT STWORZONY STAN NAZWY PORTÓW
5b064a6de6d8417 ... alpine: najnowsze "sh -c 'ls $ MY_VAR'" 2 minuty temu Wyjście (0) 2 minuty temu alpine-example
Widzimy, że polecenie zostało przekazane do punktu wejścia: sh -c 'ls $MY_VAR'ale w $MY_VAR rzeczywistości nie zostało rozwiązane.
2) docker inspect CONTAINER
Kiedy sprawdzamy pojemnik z przykładem alpejskim:
docker inspect alpine-example | grep -4 Cmd
Polecenie również tam jest, ale nadal nie widzimy wartości zmiennej env:
"Cmd": [
"sh",
"-c",
"ls $MY_VAR"
],
W rzeczywistości nie widzieliśmy interpolowanych zmiennych za pomocą tych poleceń dokera.
W ramach kompromisu moglibyśmy wyświetlić osobno zmienne polecenia i env dla kontenera z inspekcją:
docker inspect alpine-example | grep -4 -E "Cmd|Env"
To drukuje:
"Env": [
"MY_VAR=/var",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"sh",
"-c",
"ls $MY_VAR"
]
Bardziej dokowanym sposobem byłoby użycie --formatflagi, docker inspectktóra pozwala określić atrybuty JSON do renderowania:
docker inspect --format '{{.Name}} {{.Config.Cmd}} {{ (.Config.Env) }}' alpine-example
To daje:
/ alpine-example [sh -c ls $ MY_VAR] [MY_VAR = / var PATH = / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin]
3) Pobierz uruchomiony proces z samego kontenera w celu uruchomienia kontenerów
Punkt wejścia i polecenie wykonane przez okno dokowane mogą być pomocne, ale w niektórych przypadkach nie są wystarczające, ponieważ jest to „tylko” skrypt punktu wejścia opakowania ( .sh) odpowiedzialny za uruchomienie procesu rzeczywistego / podstawowego.
Na przykład, gdy uruchamiam kontener Nexus, polecenie jest wykonywane i wyświetlane, aby uruchomić kontener "sh -c ${SONATYPE_DIR}/start-nexus-repository-manager.sh".
To znaczy dla PostgreSQL "docker-entrypoint.sh postgres".
Aby uzyskać więcej informacji, możemy wykonać na działającym kontenerze
docker exec CONTAINER ps aux.
Może drukować inne procesy, które mogą nas nie interesować.
Aby zawęzić do początkowego procesu uruchomionego przez punkt wejścia, możemy wykonać:
docker exec CONTAINER ps -1
Podaję, 1ponieważ proces wykonywany przez punkt wejścia jest zwykle tym z 1identyfikatorem.
Bez pstego nadal moglibyśmy znaleźć informacje w /proc/1/cmdline(w większości dystrybucji Linuksa, ale nie we wszystkich). Na przykład :
docker exec CONTAINER cat /proc/1/cmdline | sed -e "s/\x00/ /g"; echo
Jeśli mamy dostęp do hosta dokera, który uruchomił kontener, inną alternatywą dla uzyskania pełnej komendy procesu wykonanego przez punkt wejścia jest:: wykonaj, ps -PIDgdzie PID jest procesem lokalnym utworzonym przez demona Docker w celu uruchomienia kontenera, takiego jak:
ps -$(docker container inspect --format '{{.State.Pid}}' CONTAINER)
Przyjazne dla użytkownika formatowanie z dokerem ps
docker ps --no-truncnie zawsze jest łatwy do odczytania.
Określenie kolumn do wydrukowania w formacie tabelarycznym może to poprawić:
docker ps --no-trunc --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"
Utworzenie aliasu może pomóc:
alias dps='docker ps --no-trunc --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"'