[docker] Docker에서 컨테이너 실행 / 중지에 대한 전체 명령보기

Docker에서 실행중인 컨테이너 / 프로세스의 전체 명령을 어떻게 볼 수 있습니까?

$ 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

“nginx -g ‘daemon of”만 볼 수 있습니다. 여기서 전체 명령이 아닙니다.



답변

docker ps --no-trunc 실행중인 컨테이너의 다른 세부 정보와 함께 전체 명령을 표시합니다.


답변

사용하다:

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

… 모든 컨테이너에 대해 “도커 검사”를 수행합니다.


답변

사용하다:

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

명령 경로와 인수가 표시됩니다 docker ps.


답변

자식 저장소 https://github.com/lavie/runlike 에서 runlike 사용

runlike를 설치하려면

pip install runlike

컨테이너 ID를 인수로 허용하므로 컨테이너 ID를 추출하려면 다음 명령을 사용하십시오.

docker ps -a -q

runlike를 사용하여 다음 명령으로 완전한 docker run 명령을 추출하는 것이 좋습니다

runlike <docker container ID>


답변

TL-DR

docker ps --no-truncdocker inspect CONTAINER에 전달 된 명령에 따라, 컨테이너를 시작하는 실행 엔트리 포인트를 제공하지만, 그 같은 몇 가지 부분을 놓칠 수 있습니다 ${ANY_VAR}해결로 컨테이너 환경 변수가 인쇄되지 않기 때문에.

이를 극복하기 위해 docker inspect CONTAINER컨테이너에서 정의 된 env 변수와 해당 값을 Config.Env속성 에서 별도로 검색 할 수 있기 때문에 이점이 있습니다.

docker psdocker inspect실행 된 엔트리 포인트와 명령에 대한 정보를 제공합니다. 종종 이는 랩퍼 시작점 스크립트 ( .sh)이며 컨테이너가 시작한 “실제”프로그램이 아닙니다. 그것에 대한 정보를 얻으려면 프로세스 정보를 요청 ps하거나 /proc/1/cmdline도움을 요청하십시오 .


1) docker ps --no-trunc

실행중인 모든 컨테이너에 대해 시작점과 명령이 인쇄됩니다. 진입 점에 전달 된 명령을 인쇄하는 동안 (이를 통과하면) docker env 변수 값 (예 : $FOO또는 ${FOO})을 표시하지 않습니다 .
컨테이너가 env 변수를 사용하면 충분하지 않을 수 있습니다.

예를 들어, 알파인 컨테이너를 실행하십시오.

docker run --name alpine-example -e MY_VAR=/var alpine:latest sh -c 'ls $MY_VAR'

다음과 같은 docker -ps를 사용하는 경우 :

도커 ps -a-필터 이름 = 알파인 예 –no-trunc

다음을 인쇄합니다.

컨테이너 ID 이미지 명령 생성 상태 포트 이름
5b064a6de6d8417 ... alpine : latest "sh -c 'ls $ MY_VAR'"2 분 전 종료 (0) 2 분 전 alpine-example

명령이 진입 점으로 전달 된 것을 볼 수 sh -c 'ls $MY_VAR'있지만 $MY_VAR 실제로는 해결되지 않습니다.

2) docker inspect CONTAINER

알파인 예제 컨테이너를 검사 할 때 :

docker inspect alpine-example | grep -4 Cmd

명령도 있지만 여전히 env 변수 값이 표시되지 않습니다.

        "Cmd": [
            "sh",
            "-c",
            "ls $MY_VAR"
        ],

실제로 이러한 도커 명령으로 보간 변수를 볼 수 없었습니다.
트레이드 오프로서, docker inspect가있는 컨테이너의 명령 및 env 변수를 별도로 표시 할 수 있습니다.

docker inspect  alpine-example  | grep -4 -E "Cmd|Env"

인쇄 :

        "Env": [
            "MY_VAR=/var",
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
        ],
        "Cmd": [
            "sh",
            "-c",
            "ls $MY_VAR"
        ]

보다 독창적 인 방법은 렌더링 할 JSON 속성을 지정할 수 있는 --format플래그 를 사용하는 것입니다 docker inspect.

docker inspect --format '{{.Name}} {{.Config.Cmd}}  {{ (.Config.Env) }}'  alpine-example

출력 :

/ alpine-example [sh -c ls $ MY_VAR] [MY_VAR = / var PATH = / usr / local / sbin : / usr / local / bin : / usr / sbin : / usr / bin : / sbin : / bin]

3) 컨테이너 실행을 위해 컨테이너 자체에서 시작된 프로세스 검색

docker가 실행하는 진입 점 및 명령이 도움이 될 수 있지만 경우에 .sh따라 실제 / 핵심 프로세스를 시작 하는 래퍼 진입 점 스크립트 ( ) 만 있기 때문에 충분하지 않습니다 .
예를 들어 Nexus 컨테이너를 실행할 때 컨테이너를 실행하기 위해 실행되고 표시되는 명령은 "sh -c ${SONATYPE_DIR}/start-nexus-repository-manager.sh"입니다.
PostgreSQL의 경우는입니다 "docker-entrypoint.sh postgres".

자세한 정보를 얻으려면 실행중인 컨테이너에서 실행할 수 있습니다
docker exec CONTAINER ps aux.
관심이없는 다른 프로세스를 인쇄 할 수 있습니다.
진입 점에서 시작된 초기 프로세스로 좁히기 위해 다음을 수행 할 수 있습니다.

docker exec CONTAINER ps -1

1진입 점에 의해 실행되는 프로세스가 일반적으로 1ID 가있는 프로세스이기 때문에 지정 합니다 .

이 없으면 ps, /proc/1/cmdline(대부분의 Linux 배포판에서 전부는 아니지만) 정보를 찾을 수 있습니다 . 예를 들면 다음과 같습니다.

docker exec CONTAINER cat /proc/1/cmdline | sed -e "s/\x00/ /g"; echo

컨테이너를 시작한 도커 호스트에 액세스 할 수있는 경우 진입 점에 의해 실행되는 프로세스의 전체 명령을 얻는 또 다른 방법은 다음과 같습니다. : execute ps -PID여기서 PID는 다음과 같이 컨테이너를 실행하기 위해 Docker 데몬이 만든 로컬 프로세스입니다.

ps -$(docker container inspect --format '{{.State.Pid}}'  CONTAINER)

docker ps를 사용한 사용자 친화적 인 서식

docker ps --no-trunc항상 읽기 쉽지는 않습니다.
인쇄 할 열과 표 형식을 지정하면 더 나을 수 있습니다.

docker ps   --no-trunc  --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"

별명을 작성하면 도움이 될 수 있습니다.

alias dps='docker ps   --no-trunc  --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"'


답변

너무 유용하기 때문에 Dylan의 의견을 완전한 대답으로 옮기기 :

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

무엇을합니까? 런컨테이너 내에서 https://github.com/lavie/runlike를 하고 완전한 docker run 명령을 얻은 다음 컨테이너를 제거합니다.


답변