Jak mogę zobaczyć pełne polecenie uruchomionego kontenera / procesu w Dockerze?
$ docker ps --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5b6291859b61 nginx:1.7.8 "nginx -g 'daemon of 4 minutes ago Exited (0) 4 minutes ago thirsty_brattain
Widzę tylko demona „nginx -g” z… .. tutaj, a nie pełne polecenie.
Odpowiedzi:
docker ps --no-trunc
wyświetli pełne polecenie wraz z innymi szczegółami uruchomionych kontenerów.źródło
--no-trunc
.docker ps --no-trunc
docker ps --all --no-trunc|cut -c-400
Posługiwać się:
... wykonuje „kontrolę dokera” dla wszystkich kontenerów.
źródło
docker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $(docker ps -a -q)
sudo
przed komendą, dostaniesz"docker inspect" requires at least 1 argument(s).
ze względu na drugie wywołanie, aby uzyskać wszystkie nazwy kontenerów, prawdopodobnie będziesz chciał dodać sudo bezpośrednio w środku$(
.Posługiwać się:
Wyświetli ścieżkę polecenia i argumenty, podobnie jak
docker ps
.źródło
kube-apiserver
?docker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q) | grep kube-apiserver
Użyj runlike z repozytorium git https://github.com/lavie/runlike
Aby zainstalować runless
Ponieważ akceptuje identyfikator kontenera jako argument, aby wyodrębnić identyfikator kontenera, użyj następującego polecenia
Dobrze jest użyć polecenia runlike, aby wyodrębnić pełne polecenie uruchomienia dokera za pomocą następującego polecenia
źródło
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER
TL-DR
docker ps --no-trunc
idocker 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 zConfig.Env
właściwości.docker ps
idocker 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 procesups
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:
Gdy używasz dokera -ps, takiego jak:
Drukuje:
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:
Polecenie również tam jest, ale nadal nie widzimy wartości zmiennej env:
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ą:
To drukuje:
Bardziej dokowanym sposobem byłoby użycie
--format
flagi,docker inspect
która pozwala określić atrybuty JSON do renderowania:To daje:
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ć:
Podaję,
1
ponieważ proces wykonywany przez punkt wejścia jest zwykle tym z1
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 :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: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ć:
Utworzenie aliasu może pomóc:
źródło
Przeniesienie komentarza Dylana do pełnej odpowiedzi, ponieważ ZBYT PRZYDATNE:
Co to robi? Uruchamia https://github.com/lavie/runlike w kontenerze, pobiera pełne polecenie uruchomienia dokera, a następnie usuwa kontener.
źródło