[docker] 기존 Docker 컨테이너에서 명령을 어떻게 실행합니까?

-d대화식이 아닌 컨테이너를 만들었습니다 .

docker run -d shykes/pybuilder bin/bash

컨테이너가 종료되었음을 알 수 있습니다.

CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS                      PORTS               NAMES
d6c45e8cc5f0        shykes/pybuilder:latest   "bin/bash"          41 minutes ago      Exited (0) 2 seconds ago                        clever_bardeen

이제 기계에서 가끔 명령을 실행하고 종료하고 싶습니다. 응답을 받으려면

나는 기계를 시작하려고했습니다. 나는 첨부를 시도했다. run컨테이너로 전화 할 수 있다고 생각 했지만 허용되지 않는 것 같습니다. 사용하는 start것만으로도 빠르게 작동하는 것 같습니다.

종료 후 대화식 모드로 돌아가고 싶습니다.

나는 시도했다 :

docker attach d6c45e8cc5f0

그러나 나는 얻는다 :

2014/10/01 22:33:34 You cannot attach to a stopped container, start it first

그러나 시작하면 어쨌든 종료됩니다. 22를 잡아라. 나는 이길 수 없다.



답변

2014 년 10 월 Docker 팀은 docker exechttps://docs.docker.com/engine/reference/commandline/exec/ 명령을 도입했습니다 .

이제 실행중인 컨테이너에서 ID (또는 이름)를 알고있는 명령을 실행할 수 있습니다.

docker exec -it <container_id_or_name> echo "Hello from container!"

주의 exec명령은 이미 실행중인 컨테이너에서 작동합니다. 컨테이너가 현재 중지 된 경우 먼저 다음 명령을 사용하여 컨테이너를 실행해야합니다.

docker run -it -d shykes/pybuilder /bin/bash

여기서 가장 중요한 것은 -d옵션입니다 detached. 이는 처음에 컨테이너 ( /bin/bash)에 제공 한 명령이 백그라운드에서 실행되고 컨테이너가 즉시 중지 되지 않음을 의미 합니다 .


답변

지정한 명령 이 종료 되면 컨테이너가 종료 됩니다. 다음 옵션을 사용하여 그대로 유지하십시오.

  • -i 부착하지 않아도 STDIN을 열어 두십시오.
  • -t 의사 TTY를 할당하십시오.

따라서 새로운 run명령은 다음과 같습니다.

docker run -it -d shykes/pybuilder bin/bash

이미 실행중인 컨테이너에 연결하려는 경우 :

docker exec -it CONTAINER_ID /bin/bash

이 예에서는 /bin/bash명령으로 사용됩니다.


답변

그래서 나는 그 대답이 위의 많은 오도 된 대답보다 간단하다고 생각합니다.

중지 된 기존 컨테이너를 시작하려면

docker start <container-name/ID>

실행중인 컨테이너를 중지하려면

docker stop <container-name/ID>

그런 다음 컨테이너의 대화식 쉘에 로그인

docker exec -it <container-name/ID> bash

기존 컨테이너를 시작하고 하나의 명령으로 첨부하려면

docker start -ai <container-name/ID>

종료시 컨테이너가 중지됩니다. 그러나 일반적으로 컨테이너를 시작하고 완료 한 후 연결 및 중지해야합니다.


답변

katrmr의 답변을 확장하려면 컨테이너가 중지되어 오류로 인해 시작할 수없는 경우 이미지로 가져와야 commit합니다. 그런 다음 새 이미지에서 bash를 시작할 수 있습니다.

docker commit [CONTAINER_ID] temporary_image
docker run --entrypoint=bash -it temporary_image


답변

여기에있는 답변 중 일부는 멈추지 않고 실행중인 컨테이너와 관련이 있기 때문에 오해의 소지가 있습니다.

Sven Dowideit는 Docker 포럼에서 컨테이너가 프로세스에 바인딩되어 있다고 설명했으며 Docker는 적어도 내부 구조로 인해 중지 된 컨테이너의 프로세스를 변경할 수없는 것으로 보입니다 : https://github.com/docker/docker/issues / 1437 ). 따라서 기본적으로 유일한 옵션은 commit이미지 에 대한 컨테이너 run와 다른 명령을 사용하는 것입니다.

https://forums.docker.com/t/run-command-in-stopped-container/343을 참조 하십시오
( ENTRYPOINT여전히 ” with arguments”접근 방식이 작동하지 않을 것이라고 생각합니다. 중지 된 컨테이너에 대한 인수)


답변

bash -c를 사용하여 명령을 실행해야했습니다.
docker exec -it CONTAINER_ID bash -c "mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql"


답변

컨테이너를 만들고 하나씩 명령을 보냅니다.

docker create --name=my_new_container -it ubuntu
docker start my_new_container
// ps -a says 'Up X seconds'
docker exec my_new_container /path/to/my/command
// ps -a still says 'Up X+Y seconds'
docker exec my_new_container /path/to/another/command