programing

"docker run -d" 후 도커 컨테이너가 자동으로 중지됩니다.

powerit 2023. 9. 15. 21:27
반응형

"docker run -d" 후 도커 컨테이너가 자동으로 중지됩니다.

"에"를 사용합니다.docker run -d에서 실행됩니다." 라고 말합니다.이런 모습입니다. 컨테이너 ID가 이미 있는 것을 확인할 수 있습니다.

root@docker:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d

하지만 내가 docker ps뛰어도 아무 것도 돌아오지 않았습니다.

그래서 ",docker ps -a 컨테이너가 이미 빠져나간 것을 볼 수 있습니다.

root@docker:/home/root# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                         PORTS               NAMES
605e3928cddd        centos:latest         "/bin/bash"         31 minutes ago      Exited (0) 31 minutes ago                          kickass_swartz

내가 잘못한게 있습니까?이 문제를 해결하려면 어떻게 해야 합니까?

centos docker 파일에 기본 명령이 있습니다.bash.

때(, )-d), 은 즉시 .), 은 됩니다 됩니다 은 .

업데이트 2017

최신 버전의 도커는 분리 모드포그라운드 모드 모두에서 컨테이너 실행을 허가합니다.-t,-i아니면-it)

이 경우 추가 명령이 필요 없으며 이로써 충분합니다.

docker run -t -d centos

배시는 뒷전에서 기다리겠습니다.
그것은 처음에 칼랴니 차우다리의 답변에서 보고되었고 저지 빈의 답변에서 자세히 보고되었습니다.

vonc@voncvb:~$ d ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4a50fd9e9189        centos              "/bin/bash"         8 seconds ago       Up 2 seconds                            wonderful_wright

산악지대의 경우 마리노스 안은 댓글로 다음과 같이 보고합니다.

docker run -t -d alpine/git프로세스를 계속 유지하지 않습니다.
할 일:야할일일:할d야:oo :docker run --entrypoint "/bin/sh" -it alpine/git


원답(2015)

이 기사에서 언급한 바와 같이:

대신docker run -i -t image your-command, 를 합니다.-d명령 하나로 컨테이너를 실행할 수 있고 + +를 눌러 컨테이너 터미널을 분리할 필요가 없으므로 권장됩니다.

그러나 에 문제가 있습니다.-d선택.명령이 포그라운드로 계속 실행되지 않는컨테이너는 즉시 중지됩니다.
도커는 포그라운드에서 계속 실행하려면 명령어가 필요합니다.그렇지 않으면 응용프로그램이 중지되고 컨테이너가 종료되는 것으로 간주됩니다.

문제는 일부 애플리케이션이 포그라운드로 실행되지 않는다는 점입니다.어떻게 하면 더 쉽게 만들 수 있을까요?

이 상황에서 추가할 수 있습니다.tail -f /dev/null
이렇게 하면 메인 명령이 백그라운드에서 실행되어도 꼬리가 계속 포그라운드에서 실행되기 때문에 컨테이너가 중지되지 않습니다.

이렇게 하면 효과가 있습니다.

docker run -d centos tail -f /dev/null

또는 도커 파일에서:

ENTRYPOINT ["tail"]
CMD ["-f","/dev/null"]

A docker ps센토스 컨테이너가 아직 작동 중인 걸 보여줄 겁니다

거기서 거기에 붙이거나 떼어낼있습니다(또는docker exec일부 명령).


그러나 비빅토르코멘트에서 언급한 바와 같이:

엔트리 포인트를 재정의하면 도커 파일에 지정된 내용이 있으면 파일이 엉망이 됩니다.
systemd특별히 관심이 있습니다.

/dev/null또한 별로 설득력이 없어 보입니다. 본질적으로 시스템에 불필요한 시스템 호출을 쏟아 붓는 것입니다.
수면과 함께 하는 또 다른 해결책은 훨씬 나아 보입니다.

POSIX에서 고려되지 않은 GNU 코어유틸 확장에 의존합니다.

대답에 따르면, 추가하는 것은.-t플래그는 백그라운드에서 실행될 때 컨테이너가 빠져나가지 못하도록 합니다.그러면 사용할 수 있습니다.docker exec -i -t <image> /bin/bash포탄 프롬프트에 들어갈 겁니다

docker run -t -d <image> <command>

-t 옵션은 "사이비 TTY를 할당한다"는 도움말이 있지만 문서화가 잘 되어 있지 않은 것 같습니다.

배경

도커 컨테이너는 프로세스("명령" 또는 "진입 지점")를 실행하여 컨테이너를 활성화합니다.명령이 계속 실행되는 한 컨테이너는 계속 실행됩니다.

경우 명령어 ( ( /bin/bash, on, 으로, on centos:latest터미널에 연결되어 있지 않고 실행할 것이 없을 때 bash가 수행하는 것과 같이) 즉시 종료됩니다.

때 ( 으로 로 할 의 를 의 으로 할 )-d프로세스를 예: :httpd이 경우 httpd 데몬이 실행되는 한 컨테이너는 활성 상태로 유지됩니다.

컨테이너 내부에서 실행 중인 데몬 프로세스 없이 컨테이너를 활성화하려는 것으로 보입니다.이것은 다소 이상합니다.(컨테이너와 상호작용할 때까지 컨테이너는 유용한 작업을 수행하지 않기 때문입니다.docker exec할 수 .), ① ② ③ ④ ⑤ ⑥ ⑦ 할 도 이 와 을 도

(컨테이너 안에서 bash 프롬프트를 받으라는 말씀이신가요?요!docker run -it centos:latest)

해결책

은 를 하는 은 하는 입니다 로 입니다 하는 은 을 실행하는 것입니다.sleep infinity∙ ∙ 데몬 하는 것과 같은 한 일을 하는 .이것은 데몬 모드에서 TTY를 할당하는 것과 같은 이상한 일을 하는 것에 의존하지 않습니다.사용하는 것과 같은 이상한 일을 하는 것에 의존하지만,sleep당신의 주요 지휘관으로서

$ docker run -d centos:latest sleep infinity
$ docker ps
CONTAINER ID  IMAGE         COMMAND          CREATED       STATUS       PORTS NAMES
d651c7a9e0ad  centos:latest "sleep infinity" 2 seconds ago Up 2 seconds       nervous_visvesvaraya

얼터너티브 솔루션

한 바와 같이 cjsimon 와,-t"sign-ttyoption "sign-tty"합니다.단,는어고기에로호할지이고도다당록면형와에고도지s이할y호tonnh당s면(ue는uttytrs다sy형tnh록og로(dn에기어or고h'ctstu-i가 있을 어쨌든 이 방법도 효과가 있을 것입니다.

$ docker run -t -d centos:latest

100% 확실하지는 않습니다.-t다른 이상한 상호작용을 일으킬 것입니다. 만약 그렇다면 아래에 댓글을 남겨주세요.

안녕 이 문제는 컨테이너에 실행 중인 어플리케이션이 없으면 도커 컨테이너가 종료되기 때문입니다.

-d 

옵션은 deamon 모드에서 컨테이너를 실행하는 것입니다.

따라서 컨테이너를 지속적으로 실행하는 방법은 응용프로그램을 계속 실행할 수 있는 도커의 셸 파일을 가리킵니다.start.sh 파일로 시도해 볼 수 있습니다.

Eg: docker run -d centos sh /yourlocation/start.sh

이 start.sh 은 끝나지 않는 응용 프로그램을 가리켜야 합니다.

애플리케이션을 실행하지 않으려면 설치할 수 있습니다.monit∙ ∙ ∙ 를 계속 이 되었는지 .이 두 사례가 당신의 컨테이너를 계속 가동시키는데 도움이 되었는지 알려주시기 바랍니다.

행운을 빌어요.

다음 중 하나를 사용하여 원하는 작업을 수행할 수 있습니다.

docker run -t -d <image-name>

아니면

docker run -i -d <image-name>

아니면

docker run -it -d <image-name>

다른 답변(예: tail -f /dev/null)에서 제시하는 명령 매개 변수는 완전히 선택 사항이며, 컨테이너를 백그라운드에서 실행 상태로 유지하는 데 필요하지 않습니다.

또한 Docker 설명서에 따르면 -i 및 -t 옵션을 결합하면 셸처럼 동작할 수 있습니다.

참조:

https://docs.docker.com/engine/reference/run/ #포그라운드

이 코드 조각을 실행합니다.ENTRYPOINT파일에서:커서내::

while true
do
    echo "Press [CTRL+C] to stop.."
    sleep 1
done

빌드된 도커 이미지를 다음과 같이 실행합니다.

docker run -td <image name>

컨테이너 셸에 로그인합니다.

docker exec -it <container id> /bin/bash

다음과 같이 명령을 실행합니다.

docker run -t -d <image-name>

port를 지정하려면 다음과 같이 명령합니다.

docker run -t -d -p <port-no> <image-name>

다음 명령을 사용하여 실행 중인 컨테이너를 확인합니다.

docker ps

완료된 Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δdocker run -di image 난 에.docker container ls당신은 그것이 실행되는 것을 보게 될 것입니다.

도커는 포그라운드에서 계속 실행하려면 명령어가 필요합니다.그렇지 않으면 응용프로그램이 중지되고 컨테이너가 종료되는 것으로 간주됩니다.

따라서 도커 입력 스크립트가 다음과 같은 백그라운드 프로세스인 경우:

/usr/local/bin/confd -interval=30 -backend etcd -node $CONFIG_CENTER &

'&'은 나중에 트리거되는 다른 포그라운드 프로세스가 없을 경우 컨테이너를 정지 및 종료합니다.따라서 솔루션은 '&'을 제거하거나 다른 전경 CMD를 실행하는 것입니다.

tail -f server.log

Docker 파일 끝에 CMD를 사용하는 경우 마지막에 코드를 추가하는 것이 가능합니다.이것은 도커가 ubuntu나 bash를 사용할 수 있는 OS를 기반으로 하는 경우에만 작동합니다.

&& /bin/bash

간단히 Docker 파일의 끝은 다음과 같습니다.

...

CMD ls && ... && /bin/bash

따라서 도커 이미지를 실행한 후에 자동으로 실행되는 것이 있으면 작업이 완료되면 bash 터미널이 도커 내부에서 활성화됩니다.따라서 셸 명령을 입력할 수 있습니다.

저만 그런 것 같지만 CentOS 7.3.1611과 Docker 1.12.6에서는 안정적으로 작동하기 위해 @VonC & @Christopher Simon이 게시한 답변을 조합하여 사용해야 했습니다.이 전에 내가 한 어떤 작업도 컨테이너가 CMD를 성공적으로 실행한 후에 컨테이너가 빠져나가는 것을 막을 수 없었습니다.oracle-xe-11Gr2와 sshd를 시작합니다.

도커파일

...
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && systemctl enable sshd
...
CMD /etc/init.d/oracle-xe start && /sbin/sshd && tail -f /dev/null

그런 다음 -d -t 와 -i 를 추가하여 실행합니다.

docker run --shm-size=2g --name oracle-db -d -t -i -p 5022:22 -p 5080:8080 -p 1521:1521 centos-oracle:7.3.1611 

벽에 머리를 부딪친 지 몇 시간이 지나서야 마침내

ssh -v root@127.0.0.1 -p 5022
...
root@127.0.0.1's password: 
debug1: Authentication succeeded (password).

어떤 이유로든 tail -f가 제거되거나 -t -d -i 옵션이 생략되면 CMD를 실행한 후 위의 내용이 종료됩니다.

저도 같은 문제가 있었습니다. 그저 다른 터미널을 열었을 뿐인데, 그것은 저에게 효과가 있었습니다.

컨테이너 생성:

docker run -d mcr.microsoft.com/mssql/server:2019-CTP3.0-ubuntu
containerid=52bbc9b30557

시작 컨테이너:

docker start 52bbc9b30557

컨테이너를 계속 실행하기 위해 bash를 시작합니다.

docker exec -it 52bbc9b30557 bash

필요한 프로세스 시작:

docker exec -it 52bbc9b30557 /path_to_cool_your_app

대화형 모드로 도커를 실행하면 문제가 해결될 수 있습니다.

대화형 모드를 사용하거나 사용하지 않고 이미지를 실행하는 예는 다음과 같습니다.

chaitra@RSK-IND-BLR-L06:~~/dockers$ sudo docker run -d -t -i test_again1.0 b6b942a79b1243bada59db19cf52da8744542fa843c95354966a18

chaitra@RSK-IND-BLR-L06:~/dockers$ sudo dockerps

컨테이너 ID IMAGE 명령 생성 상태 포트 이름

chaitra@RSK-IND-BLR-L06:~~/dockers$ sudo docker run -d -t -i test_again1.0 bash c3d6a9529fd70c5b2dc2dc2d7e90fe662d19c6dad8549e9c812fb2b7ce2105d7ff5

chaitra@RSK-IND-BLR-L06:~/dockers$ sudo dockerps

컨테이너 ID IMAGE COMMAND CREATED STATUS PORT NAMES c3d6a9529fd7 test_again1.0 "bash" 2초 전 업1초 대박_haibt

간단히 다음을 사용할 수 있습니다.

docker container run -d -it <container name or id> /bin/bash

문제에 대한 빠른 답변:

다음 명령만 실행하면 됩니다.

docker run -d image_name sleep infinity

아래 이미지 참조:

enter image description here

가이란 입니까?sleep infinity

sleep 명령은 셸이 지정된 시간 동안 대기하게 하는 Unix 명령입니다.

sleep infinity명령은 Docker에서 컨테이너를 무한정 실행할 때 사용합니다.Docker에서 컨테이너를 실행하면 컨테이너에서 지정한 명령을 실행한 다음 명령이 완료되면 종료됩니다.이된를속면도e을 사용하면 됩니다.sleep infinity지휘.

저는 같은 질문이 있는 아래의 게시물에서 설명하였습니다.

"출구"를 사용한 후 도커 알파인 컨테이너를 보관하는 방법은?

인수순서사항

Jersey Beans 답변(세 가지 예시 모두)은 저에게 효과가 있었습니다.꽤 많은 시행착오 끝에 저는 논쟁의 순서가 중요하다는 것을 깨달았습니다.

합니다: 로 합니다 를 에서 합니다 로 를 docker run -t -d <image-name>

foreground) 를 로 합니다 합니다 로 을 실행합니다.docker run <image-name> -t -d

파워셸 배경에서 온 것은 제게는 분명하지 않았습니다.

저 역시 같은 문제에 직면해 있었지만 다른 방식이었습니다.도커 컨테이너를 만들 때.백그라운드에서 실행 중인 사용하지 않는 컨테이너를 자동으로 중지합니다.때로는 사용 중인 용기를 정지시키기도 합니다.제 상황에서는 도커의 허락 때문입니다.양말 파일이 있어요. 당신이 해야할 일은 :-

  1. 도커를 다시 설치합니다.(unbuntu 작업을 할 때 여기서 설치합니다)

  2. 명령을 실행하여 권한을 변경합니다.

    sudo chmod 666 /var/run/docker.sock

  3. 도커 컴포지트 설치(여러 컨테이너를 함께 만들기 위해 컴포지트 파일이 있으므로 선택 사항)

    sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

    sudo chmod +x /usr/local/bin/docker-compose

  4. 최신 버전이 있는지 확인하고 일부 설명에 문제가 없는지 확인합니다.

  5. 그런 다음 도커 컨테이너 빌드를 실행합니다.

용기를 작동하려면 전경에서 작동시켜야 합니다.

컨테이너를 포그라운드/디태치 상태로 실행할 수 있는 여러 옵션이 있습니다.그러나 여전히 문제가 해결되지 않았다고 생각되는 경우 로그를 보고 문제를 해결해 볼 수 있습니다.

sudo docker logs -f >> container.log

또한 --syslog를 사용하여 로그에 제공된 추가 세부 정보를 표시할 수도 있습니다.

도커 파일의 App 경로가 올바르지 않음:

Alpine Linux를 사용하여 RHEL 서버에서 Docker 컨테이너로 애플리케이션을 마이그레이션하고 있었습니다.

제작 중 오류가 없어서 컨테이너가 바로 빠져나가는 것을 보고 깜짝 놀랐습니다!

첫번째 기항지:

docker logs <containerID>

이것은 내가 도커 파일에서 CMD에 제공한 바이너리의 경로가 거짓임을 드러냈습니다.

line 0: /sbin/postfix: not found

그것이 어떻게 부서졌는지는 알려주었지만 구체적으로 어디에 있는지는 알려주지 않았습니다.알파인 리눅스에서 바이너리에 대한 정확한 경로가 필요했습니다...

문제 해결:

구글링에서 올바른 경로가 나타나지 않아 도커 파일에 다음 행을 추가했습니다.

RUN which postfix

그런 다음 빌드 명령에 첨부된 아래 명령어로 제공되는 빌드 로깅을 검토하여 값을 검색했습니다.RUN which postfix

 --progress=plain > /path/to/build.log 2>&1

수정사항:

빌드를 - 하고 한 했습니다 를 를 했습니다 를 한 를 하고 ./usr/sbin/postfix합니다. - [ CMD]RUN which postfix다른 건물을 지었어요

Voila; 그 과정은 이제 계속 진행중입니다.

그래서 더프 경로가 컨테이너를 즉시 빠져나오게 하고 있었습니다.

다음 4가지 명령은 모두 도커 컨테이너를 계속 작동시키기 위해 작동합니다.

docker run -td centos
docker run -dt centos
docker run -t -d centos
docker run -d -t centos
  • 먼저 Type 명령을 실행하고 있는 컨테이너가 있는지 확인해야 합니다.

도커 ps -all

  • 실행 중인 컨테이너가 있으면 Type 명령을 중지합니다.

도커 중지 컨테이너 ID

  • 이제, 마지막으로 아래 명령을 사용하여 도커를 실행합니다......

  • 도커 런 -t -p 2020:3000 도커이미지네임

따라서 구글 크롬을 열고 localhost:2020에 방문하세요.

축하합니다 :)

언급URL : https://stackoverflow.com/questions/30209776/docker-container-will-automatically-stop-after-docker-run-d

반응형