development

도커 컨테이너가 즉시 종료되는 이유

big-blog 2020. 5. 12. 19:11
반응형

도커 컨테이너가 즉시 종료되는 이유


나는 백그라운드에서 컨테이너를 사용하여

 docker run -d --name hadoop h_Service

빠르게 종료됩니다. 그러나 전경에서 실행하면 정상적으로 작동합니다. 사용하여 로그를 확인했습니다.

docker logs hadoop

오류가 없었습니다. 어떤 아이디어?

독커 파일

 FROM java_ubuntu_new
 RUN wget http://archive.cloudera.com/cdh4/one-click-install/precise/amd64/cdh4-repository_1.0_all.deb
 RUN dpkg -i cdh4-repository_1.0_all.deb
 RUN curl -s http://archive.cloudera.com/cdh4/ubuntu/precise/amd64/cdh/archive.key | apt-key add -
 RUN  apt-get update
 RUN apt-get install -y hadoop-0.20-conf-pseudo
 RUN dpkg -L hadoop-0.20-conf-pseudo
 USER hdfs
 RUN hdfs namenode -format
 USER root
 RUN apt-get install -y sudo
 ADD . /usr/local/
 RUN chmod 777 /usr/local/start-all.sh
 CMD ["/usr/local/start-all.sh"]

start-all.sh

 #!/usr/bin/env bash
 /etc/init.d/hadoop-hdfs-namenode start
 /etc/init.d/hadoop-hdfs-datanode start
 /etc/init.d/hadoop-hdfs-secondarynamenode start
 /etc/init.d/hadoop-0.20-mapreduce-tasktracker start
 sudo -u hdfs hadoop fs -chmod 777 /
 /etc/init.d/hadoop-0.20-mapreduce-jobtracker start
 /bin/bash

기본 프로세스가 완료되면 도커 컨테이너가 종료됩니다.

이 경우 start-all.sh스크립트가 끝나면 종료됩니다. 이 경우 hadoop에 대해 알려주는 hadoop에 대해 충분히 알지 못하지만 포 그라운드에서 무언가를 실행하거나 runit 또는 supervisord와 같은 프로세스 관리자를 사용하여 프로세스를 실행해야합니다.

나는 당신이 지정하지 않으면 당신은 그것이 작동하는 것에 대해 착각해야한다고 생각합니다 -d. 정확히 같은 효과를 가져야합니다. 약간 다른 명령으로 실행하거나 -it변경 하여 사용할 수 있다고 생각합니다 .

간단한 해결책은 다음과 같은 것을 추가하는 것입니다.

while true; do sleep 1000; done

스크립트 끝까지. 그러나 스크립트가 실제로 시작된 프로세스를 모니터링해야하기 때문에 이것을 좋아하지 않습니다.

(나는 https://github.com/sequenceiq/hadoop-docker/blob/master/bootstrap.sh 에서 해당 코드를 훔쳤다고 말해야합니다 )


이것은 나를 위해 속임수를했다 :

docker run -dit ubuntu

그 후, 나는 다음을 사용하여 실행중인 프로세스를 확인했다.

docker ps -a

컨테이너를 다시 부착

docker attach CONTAINER_NAME

힌트 : 컨테이너 유형을 중지하지 않고 종료하는 경우 : ^P^Q


나는 말을 확장하거나 감히하고 싶습니다.

달릴 때

docker run -dit ubuntu

기본적으로 컨테이너를 대화식 모드로 백그라운드에서 실행 중입니다.

CTRL + D (가장 일반적인 방법)로 컨테이너를 연결하고 종료하면 위의 명령으로 컨테이너를 시작한 주요 프로세스를 종료했기 때문에 컨테이너를 중지합니다.

이미 실행중인 컨테이너를 활용하기 위해 다른 bash 프로세스를 포크하고 다음을 실행하여 의사 TTY를 얻습니다.

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

스크립트 실행을 마친 후에 컨테이너가 유지되기를 원할 때마다

&& tail -f /dev/null

명령의 끝에서. 따라서 다음과 같아야합니다.

/usr/local/start-all.sh && tail -f /dev/null

좋은 접근 방법은 프로세스와 서비스를 백그라운드에서 시작하고 wait [n ...]스크립트 끝에 명령을 사용하는 것 입니다. bash에서 wait 명령은 현재 프로세스가 다음을 수행하도록합니다.

지정된 각 프로세스를 기다렸다가 종료 상태를 반환하십시오. n을 지정하지 않으면 현재 활성화 된 모든 하위 프로세스가 대기되고 리턴 상태는 0입니다.

나는 그의 엘크 빌드를 위해 Sébastien Pujadas의 시작 스크립트 에서이 아이디어를 얻었습니다 .

원래 질문에서 시작하면 start-all.sh는 다음과 같습니다.

 #!/usr/bin/env bash
 /etc/init.d/hadoop-hdfs-namenode start &
 /etc/init.d/hadoop-hdfs-datanode start &
 /etc/init.d/hadoop-hdfs-secondarynamenode start &
 /etc/init.d/hadoop-0.20-mapreduce-tasktracker start &
 sudo -u hdfs hadoop fs -chmod 777 /
 /etc/init.d/hadoop-0.20-mapreduce-jobtracker start &
 wait

Why docker container exits immediately?

If you want to force the image to hang around (in order to debug something or examine state of the file system) you can override the entry point to change it to a shell:

docker run -it --entrypoint=/bin/bash myimagename

My pracitce is in the Dockerfile start a shell which will not exit immediately CMD [ "sh", "-c", "service ssh start; bash"], then run docker run -dit image_name. This way the (ssh) service and container is up running.


Add this to the end of Dockerfile:

CMD tail -f /dev/null

Sample Docker file:

FROM ubuntu:16.04

# other commands

CMD tail -f /dev/null

Reference


Adding

exec "$@"

at the end of my shell script was my fix!


If you check Dockerfile from containers, for example fballiano/magento2-apache-php

you'll see that at the end of his file he adds the following command: while true; do sleep 1; done

Now, what I recommend, is that you do this

docker container ls --all | grep 127

Then, you will see if your docker image had an error, if it exits with 0, then it probably needs one of these commands that will sleep forever.


There are many possible ways to cause a docker to exit immediately. For me, it was the problem with my Dockerfile. There was a bug in that file. I had ENTRYPOINT ["dotnet", "M4Movie_Api.dll] instead of ENTRYPOINT ["dotnet", "M4Movie_Api.dll"]. As you can see I had missed one quotation(") at the end.

To analyze the problem I started my container and quickly attached my container so that I could see what was the exact problem.

C:\SVenu\M4Movie\Api\Api>docker start 4ea373efa21b


C:\SVenu\M4Movie\Api\Api>docker attach 4ea373efa21b

Where 4ea373efa21b is my container id. This drives me to the actual issue.

enter image description here

After finding the issue, I had to build, restore, publish my container again.


You can run the container using this restart flag.

docker run -d --name=<some-name> -p xxxx:xxxx ... <image-name> --restart=unless-stopped

Since the image is a linux, one thing to check is to make sure any shell scripts used in the container have unix line endings. If they have a ^M at the end then they are windows line endings. One way to fix them is with dos2unix on /usr/local/start-all.sh to convert them from windows to unix. Running the docker in interactive mode can help figure out other problems. You could have a file name typo or something. see https://en.wikipedia.org/wiki/Newline

참고URL : https://stackoverflow.com/questions/28212380/why-docker-container-exits-immediately

반응형