[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-trunc
과 docker inspect CONTAINER
에 전달 된 명령에 따라, 컨테이너를 시작하는 실행 엔트리 포인트를 제공하지만, 그 같은 몇 가지 부분을 놓칠 수 있습니다 ${ANY_VAR}
해결로 컨테이너 환경 변수가 인쇄되지 않기 때문에.
이를 극복하기 위해 docker inspect CONTAINER
컨테이너에서 정의 된 env 변수와 해당 값을 Config.Env
속성 에서 별도로 검색 할 수 있기 때문에 이점이 있습니다.
docker ps
및 docker 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
진입 점에 의해 실행되는 프로세스가 일반적으로 1
ID 가있는 프로세스이기 때문에 지정 합니다 .
이 없으면 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 명령을 얻은 다음 컨테이너를 제거합니다.