Zobacz pełne polecenie uruchamiania / zatrzymywania kontenera w Dockerze

263

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.

Niklas9
źródło
2
patrz również tutaj: stackoverflow.com/q/32758793/1747983
Tilo

Odpowiedzi:

544

docker ps --no-trunc wyświetli pełne polecenie wraz z innymi szczegółami uruchomionych kontenerów.

Scott S.
źródło
13
Dzięki temu bardzo pomogłem. Tylko uwaga: „-notrunc” jest przestarzałe, zastąpione przez --no-trunc.
Prometeusz
2
To mi nie zadziałało. Dało mi to polecenie, ale nie wszystkie przełączniki (o tym myślę, używając „pełnego polecenia”). Polecenie runless wspomniane inne łącze powyżej działało dla mnie lepiej.
Dylan Smith
1
aby uzyskać pełne polecenie tylko uruchomionych kontenerów, po prostu usuń polecenie all. docker ps --no-trunc
Jacob Morris
Dzięki - poprawione. Moje poprzednie polecenie dotyczyło wszystkich kontenerów, a nie tylko ich uruchamiania, co było pierwotnym pytaniem.
Scott S.
Nieprzerwane polecenie może być bardzo długie, zobacz tylko pierwsze 400 znaków w każdym wierszudocker ps --all --no-trunc|cut -c-400
rubo77
183

Posługiwać się:

docker inspect -f "{{.Name}} {{.Config.Cmd}}" $(docker ps -a -q)

... wykonuje „kontrolę dokera” dla wszystkich kontenerów.

st0ne
źródło
8
To nie wyświetla polecenia ps dokera. Komenda dokera ps odpowiada komendzie inspekcji Path i Args.
JDiMatteo,
3
Brak bueno od stycznia 2018 r.
sg
4
tj.docker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $(docker ps -a -q)
Paul
2
Jeśli rzucasz sudoprzed 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 $(.
RandomInsano
a dla tych, którzy chcą lepiej zrozumieć zapytanie -f, znalazłem tutaj dobre wyjaśnienie container-solutions.com/docker-inspect-template-magic
intijk
16

Posługiwać się:

docker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q)

Wyświetli ścieżkę polecenia i argumenty, podobnie jak docker ps.

JDiMatteo
źródło
Jak zmodyfikowałbyś to, aby wyszukać określone polecenie, takie jak kube-apiserver?
Jonathan
@Jathanathandocker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q) | grep kube-apiserver
rrw
8

Użyj runlike z repozytorium git https://github.com/lavie/runlike

Aby zainstalować runless

pip install runlike

Ponieważ akceptuje identyfikator kontenera jako argument, aby wyodrębnić identyfikator kontenera, użyj następującego polecenia

docker ps -a -q

Dobrze jest użyć polecenia runlike, aby wyodrębnić pełne polecenie uruchomienia dokera za pomocą następującego polecenia

runlike <docker container ID>
Abhishek Jain
źródło
Nie działa Pokaż „Command” [„docker”, „inspect”, u'06e6a369f909 ”]„ zwrócił niezerowy status wyjścia 1 ”
fstang
Czy zainstalowałeś runiczny, jak wspomniałem
Abhishek Jain
5
Jeszcze lepiej możesz biegać jak w kontenerze dokera i unikać instalowania go:docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER
Dylan Smith
3

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}}"'
davidxxx
źródło
2

Przeniesienie komentarza Dylana do pełnej odpowiedzi, ponieważ ZBYT PRZYDATNE:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER

Co to robi? Uruchamia https://github.com/lavie/runlike w kontenerze, pobiera pełne polecenie uruchomienia dokera, a następnie usuwa kontener.

Gunar Gessner
źródło