TL-DR
docker ps --no-trunc
i docker inspect CONTAINER
podaj 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 CONTAINER
ma tę zaletę, że pozwala również pobierać osobno zmienne env i ich wartości zdefiniowane w kontenerze z Config.Env
właściwości.
docker ps
i docker inspect
podać 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 ps
lub /proc/1/cmdline
pomó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 $FOO
lub ${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 --format
flagi, docker inspect
któ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ę, 1
ponieważ proces wykonywany przez punkt wejścia jest zwykle tym z 1
identyfikatorem.
Bez ps
tego 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 -PID
gdzie 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-trunc
nie 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}}"'