[docker] 다른 명령으로 중지 된 Docker 컨테이너를 시작하는 방법은 무엇입니까?

기본 명령이 충돌하여 중지 된 Docker 컨테이너를 다른 명령으로 시작하고 싶습니다. 컨테이너를 시작할 수 없으며 ‘docker exec’를 사용할 수 있습니다.

기본적으로 컨테이너의 내용을 검사 할 수 있도록 쉘을 시작하고 싶습니다.

다행히도 -it 옵션으로 컨테이너를 만들었습니다!



답변

중지 된 컨테이너 ID 찾기

docker ps -a

중지 된 컨테이너를 커미트하십시오.

이 명령은 수정 된 컨테이너 상태를 새 이미지로 저장합니다 user/test_image

docker commit $CONTAINER_ID user/test_image

다른 진입 점으로 시작 / 실행 :

docker run -ti --entrypoint=sh user/test_image

진입 점 인수 설명 : https://docs.docker.com/engine/reference/run/#/entrypoint-default-command-to-execute-at-runtime

노트 :

위의 단계는 동일한 파일 시스템 상태로 중지 된 컨테이너를 시작합니다. 빠른 조사에 좋습니다. 그러나 환경 변수, 네트워크 구성, 연결된 볼륨 및 기타 직원은 상속되지 않으므로 이러한 모든 인수를 명시 적으로 지정해야합니다.

중지 된 컨테이너를 시작하는 단계는 여기에서 차용되었습니다 : (마지막 코멘트) https://github.com/docker/docker/issues/18078


답변

중지 된 컨테이너에 해당하는이 파일을 편집하십시오.

vi /var/lib/docker/containers/923...4f6/config.json

“Path”매개 변수를 변경하여 새 명령을 지정하십시오 (예 : / bin / bash). “Args”매개 변수를 설정하여 명령에 인수를 전달할 수도 있습니다.

docker 서비스를 다시 시작하십시오 (이것은 모든 실행중인 컨테이너를 중지시킵니다).

service docker restart

컨테이너를 나열하고 명령이 변경되었는지 확인하십시오.

docker ps -a

컨테이너를 시작하고 연결하면 이제 껍질 안에 있어야합니다!

docker start -ai mad_brattain

Docker 1.7.1을 사용하여 Fedora 22에서 작업했습니다.

참고 : 쉘이 대화식이 아닌 경우 (예 : -it 옵션으로 원래 컨테이너를 작성하지 않은 경우) 대신 명령을 “/ bin / sleep 600″또는 “/ bin / tail -f / dev / null”로 변경할 수 있습니다. 쉘을 얻는 또 다른 방법으로 “docker exec -it CONTID / bin / bash”를 수행 할 충분한 시간을 제공합니다.

참고 2 : 최신 버전의 도커에는 config.v2.json이 있으며, 여기서 엔트리 포인트 또는 Cmd를 변경해야합니다 (user60561 덕분에).


답변

진입 점 스크립트 상단에 수표 추가

Docker는 실제로이 기능을 새로운 기능으로 구현해야하지만 성공 또는 실패 후 종료되는 진입 점이있어 상황을 디버그하기가 어려운 상황에 대한 또 다른 해결 방법이 있습니다.

진입 점 스크립트가없는 경우 컨테이너에 필요한 명령을 실행하는 스크립트를 작성하십시오. 그런 다음이 파일의 맨 위에 다음 행을 추가하십시오 entrypoint.sh.

# Run once, hold otherwise
if [ -f "already_ran" ]; then
    echo "Already ran the Entrypoint once. Holding indefinitely for debugging."
    cat
fi
touch already_ran

# Do your main things down here

cat연결 을 유지 하려면 TTY를 제공해야합니다. Entrypoint 스크립트를 사용하여 컨테이너를 다음과 같이 실행합니다.

docker run -t --entrypoint entrypoint.sh image_name

그러면 스크립트가 한 번 실행되어 이미 컨테이너의 가상 파일 시스템에서 실행되었음을 나타내는 파일이 생성됩니다. 그런 다음 컨테이너를 다시 시작하여 디버깅을 수행 할 수 있습니다.

docker start container_name

컨테이너를 다시 시작하면 already_ran파일이 발견되어 시작점 스크립트가 중단됩니다 cat(입력되지 않는 입력을 영원히 기다리지 만 컨테이너를 활성 상태로 유지함 ). 그런 다음 디버깅 bash세션 을 실행할 수 있습니다 .

docker exec -i container_name bash

컨테이너가 실행되는 동안 디버깅해야하는 경우 스크립트를 제거 already_ran하고 수동으로 실행하여 entrypoint.sh다시 실행할 수도 있습니다.


답변

내 문제:

  • 나는 컨테이너를 시작했다. docker run <IMAGE_NAME>
  • 그런 다음이 컨테이너에 파일을 추가했습니다.
  • 그런 다음 컨테이너를 닫고 위와 동일한 명령으로 다시 시작하려고했습니다.
  • 그러나 새 파일을 확인했을 때 누락되었습니다
  • 내가 실행할 때 docker ps -a두 개의 컨테이너를 볼 수있었습니다.
  • docker run <IMAGE_NAME>, 명령 을 실행할 때마다 새로운 이미지가 생성됩니다.

솔루션 :
첫 번째 실행에서 작성한 동일한 컨테이너에서 작업하려면 다음 단계를 수행하십시오.

  • docker ps 컨테이너의 컨테이너를 얻기 위해
  • docker container start <CONTAINER_ID> 기존 컨테이너를 시작하려면
  • 그럼 당신은 당신이 떠난 곳에서 계속할 수 있습니다. 예 :docker exec -it <CONTAINER_ID> /bin/bash
  • 그런 다음 새 이미지를 만들어 결정할 수 있습니다

답변

@Dmitriusan의 답변을 가져 와서 별칭으로 만들었습니다.

별칭 docker-run-prev-container = ‘prev_container_id = “$ (docker ps -aq | head -n1)”&& docker commit “$ prev_container_id” “prev_container / $ prev_container / $ prev_container_id”&& docker run -it –entrypoint = bash “prev_container / $ prev_container_id ” ‘

~/.bashrc파일을 aliases 파일에 추가하면 멋진 새 docker-run-prev-container별칭이 생성되어 이전 컨테이너의 셸로 이동합니다.

디버깅 실패에 도움이됩니다 docker build.


답변

이것은 정확히 원하는 것이 아니지만 docker export파일을 검사하는 것만 으로 중지 된 컨테이너에서 사용할 수 있습니다 .

mkdir $TARGET_DIR
docker export $CONTAINER_ID | tar -x -C $TARGET_DIR


답변

컨테이너가 종료되는지 여부는 지정되지 않았으며 코드가 충돌하고 컨테이너에서 무슨 일이 일어나고 있는지 볼 필요가 있습니다. 종료되지 않으면 또 다른 잠재적 솔루션이 있습니다.

컨테이너 ID를 docker ps

docker exec -it 665b4a1e17b6 /bin/sh

진입 점이 문제가있는 것으로 설정되면 Dmitriusan의 답변에서 제안한대로 무시할 수도 있습니다. 로 실행중인 컨테이너에 연결할 수 있습니다 docker attach. 많은 솔루션이 다른 솔루션입니다. 이미지에 커밋 할 필요가 없습니다. 불필요한 것 같습니다.

부두 노동자 간부에 대한 문서 – https://docs.docker.com/engine/reference/commandline/exec/

부두 노동자에 대한 문서는 첨부 – https://docs.docker.com/engine/reference/commandline/attach/