답변:
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
inspect
출력을 후속 실행에 사용되는 구성으로 변환 할 수 있습니까?
중지 된 컨테이너에 해당하는이 파일을 편집하십시오.
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 덕분에).
..."Path":"tail","Args":["-f","/dev/null"]...
config.v2.json
중 하나를 변경해야하는 곳이 있습니다 . Entrypoint
Cmd
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
다시 실행할 수도 있습니다.
/bin/sh
대신 실행 점 cat
을 만들 수 있습니다. 그러면 항상 다시 시작하면됩니다. 당신의 솔루션은 바위!
내 문제:
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
docker run <containerID>
@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/
나는 실제로이 두 대답에 동의하지 않습니다. 컨테이너에 무엇이 있는지 보려면이 명령을 실행하여 쉘을 얻을 수 있습니다. 구성을 전혀 또는 전혀 변경하지 않아도됩니다.
docker run -it <image_name> bash
docker logs <container_id> --follow
필요한 것을 제공합니다. 다른 대안은 위의 명령을 사용한 다음 dockerfile에서 동일한 명령으로 해당 이미지에서 충돌 서비스를 시작하고 거기서부터 디버그하는 것입니다.