도커 컨테이너가 즉시 종료되는 이유
나는 백그라운드에서 컨테이너를 실행합니다.
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
이것이 저에게 효과가 있었습니다.
docker run -dit ubuntu
그 후 다음을 사용하여 실행 중인 프로세스를 확인했습니다.
docker ps -a
컨테이너를 다시 부착하기 위해
docker attach CONTAINER_NAME
: :^P^Q
도커 컨테이너는 주 공정이 완료되면 종료됩니다.
됩니다 시 됩니다.start-all.sh
대본이 끝납니다.하둡에 대해서는 잘 몰라서 이 경우 어떻게 해야 하는지 알려드릴 수는 없지만, 실행 중인 것을 포그라운드로 남겨두거나 프로세스를 실행하려면 프로세스 관리자(예: runit 또는 supervisor)를 실행해야 합니다.
합니다를 하신 것 .-d
; 정확히 같은 효과가 있어야 합니다.g를 사용한 것 .-it
상황이 바뀔 겁니다
간단한 해결책은 다음과 같은 것을 추가하는 것입니다.
while true; do sleep 1000; done
대본의 끝까지.그러나 저는 이것이 마음에 들지 않습니다. 왜냐하면 스크립트는 시작되는 과정을 실제로 모니터링해야 하기 때문입니다.
(https://github.com/sequenceiq/hadoop-docker/blob/master/bootstrap.sh) 에서 그 코드를 훔쳤다고 말해야겠습니다.
나는 캠포저가 언급한 답변을 확장하거나 감히 말하고 싶습니다.
뛸때
docker run -dit ubuntu
기본적으로 컨테이너를 백그라운드에서 대화형 모드로 실행합니다.
Ctrl+D(가장 일반적인 방법)로 컨테이너를 첨부하고 종료할 때, 위의 명령으로 컨테이너를 시작한 주요 프로세스를 방금 종료했기 때문에 컨테이너를 중지합니다.
이미 실행 중인 컨테이너를 활용하여 다른 bash 프로세스를 포크하고 다음을 실행하여 의사 TTY를 얻을 수 있습니다.
docker exec -it <container ID> /bin/bash
도커 컨테이너가 즉시 빠져나가는 이유는 무엇입니까?
이미지를 강제로 행업(디버그하거나 파일 시스템의 상태를 검사하기 위해)하려면 진입점을 재정의하여 셸로 변경할 수 있습니다.
docker run -it --entrypoint=/bin/bash myimagename
스크립트 실행을 완료한 후 컨테이너가 잠기지 않기를 원할 때마다 추가합니다.
&& tail -f /dev/null
지휘권의 끝에그렇다면 다음과 같습니다.
/usr/local/start-all.sh && tail -f /dev/null
컨테이너를 빠져나오지 않고 실행해야 하는 경우에는 실행합니다.
docker run -dit --name MY_CONTAINER MY_IMAGE:latest
그리고 나서.
docker exec -it MY_CONTAINER /bin/bash
그리고 당신은 그 안에 있을 것입니다.bash
컨테이너의 셸, 그리고 그것이 빠져나가지 않아야 합니다.
다음은 ROS 시뮬레이션에서 roslaunch에서만 작동한 것으로, 이는 도커 컴포지트의 기본 매개 변수가 아닐 가능성이 높습니다.
마음: 이것은 읽기 어렵고, 단지 자필 파라미터에 관한 것인 것 같습니다.그냥 넘어가세요.
중에 .docker-compose
,사용하다
command: bash -c "MY_COMMAND --wait"
여기에 이미 두 개의 다른 답변에 의해 언급된 바와 같이 (분명히 도커 작곡을 언급하지는 않았지만, 그래서 나는 여전히 "기다림" 트릭을 다시 언급합니다.)
ROS 시뮬레이션에서, 예를 들면 다음과 같습니다.
command: bash -c "roslaunch gazebo_ros empty_world.launch --wait"
으로.--wait
이른바 ROS 네트워크를 도커-컴포지트에서 작동시키기 위한 핵심이었습니다. 도커-컴포지트의 ROS에서 "bash: line 0: cd: MYPROJECT: 그런 파일이나 디렉터리 없음"으로 이어지는 예제 코드를 참조하십시오.더보기roslaunch
WSL2의 도커: 도커 파일: ROS gazebo가 이미 작동 중인 X 서버(윈도우의 X11 디스플레이를 사용하여)에 연결할 수 있는지 테스트하는 방법?
그래서 이것은--wait
입니다 같은 에 대한 roslaunch gazebo_ros empty_world.launch
. 그러나 링크된 자습서를 확인할 때: Roslaunch를 사용하여 Gazebo, 월드 파일 및 URDF 모델을 시작하면 코드에 이러한 매개 변수가 없습니다.
roslaunch gazebo_ros empty_world.launch paused:=true use_sim_time:=false gui:=true throttled:=false recording:=false debug:=true verbose:=true gui_required:=true
그렇기 때문에 프로젝트의 주어진 매개 변수를 자필로 작성한 확장이었을 것이라고 추측합니다.
이거 먹어봤어요.--wait
나중에 다시 다른 설정에서 작동하지 않았습니다.ROS 런치 스크립트에서는 이 Q/A에서 또 다른 답변의 해결책을 미뤘을 가능성이 높습니다.&& tail ...
).
도커 파일 끝에 추가:
CMD tail -f /dev/null
샘플 도커 파일:
FROM ubuntu:16.04
# other commands
CMD tail -f /dev/null
하고 이 될 입니다.wait [n ...]
스크립트 끝에 명령을 입력합니다. 프로세스를 과 같이 합니다. bash에서 wait합니다.
지정된 각 프로세스를 기다렸다가 종료 상태를 반환합니다.n이 주어지지 않으면 현재 활성화된 모든 자식 프로세스가 대기되며 반환 상태는 0입니다.
저는 세바스티앙 푸자다스의 엘크 빌드 시작 대본에서 이 아이디어를 얻었습니다.
원래 질문에서 따지면, 당신의 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
백그라운드에서 데몬으로 실행되도록 하려면 -d 플래그로 실행해야 합니다.
도커 런 -d -it 우분투 배시
은 도커 을 시작하는 인데, 셸은 입니다 .CMD [ "sh", "-c", "service ssh start; bash"]
, 그다음에 달리다docker run -dit image_name
및 중입니다 이렇게 하면 서비스 및 컨테이너가 실행 중입니다.
추가했습니다.read
끝에 셸 문 가 있습니다.이렇게 하면 컨테이너(시작 셸 스크립트)의 기본 프로세스가 계속 실행됩니다.
추가하기
exec "$@"
내 셸 스크립트의 마지막 부분은 내 수정이었어요!
여기에 중복된 자료가 있는데, 주요 워크로드를 백그라운드 작업으로 실행하는 일반적인 반대 패턴과 도커가 종료되는 이유에 대해 설명할 수 있는 답이 없습니다.
간단히 말해서, 만약 당신이
my-main-thing &
&
합니다를 합니다.
wait
모든 백그라운드 작업을 대기하도록 하는 스크립트의 끝에 있습니다.
기본 에 이 할 수 .while true
루프를 사용하여 영원히 다시 시작합니다.
while true; do
my-main-thing &
other things which need to happen while the main workload runs in the background
maybe if you have such things
wait
done
()while true
같은 같은 수 일입니다.while [ true ]
아니면while [ 1 ]
하지만 작가가 상상했던 의미를 의미하는 것은 아닙니다.
도커가 즉시 종료되도록 할 수 있는 여러 가지 방법이 있습니다.였습니다.Dockerfile
그 파일에 버그가 있었습니다.가지고 있었습니다ENTRYPOINT ["dotnet", "M4Movie_Api.dll]
ENTRYPOINT ["dotnet", "M4Movie_Api.dll"]
(") 를.
저는 문제를 분석하기 위해 컨테이너를 시동하고, 무엇이 정확한 문제인지 확인할 수 있도록 컨테이너를 빠르게 부착했습니다.
C:\SVenu\M4Movie\Api\Api>docker start 4ea373efa21b
C:\SVenu\M4Movie\Api\Api>docker attach 4ea373efa21b
여기서 4ea373efa21b는 내 컨테이너 ID입니다.이것은 저를 실제 문제로 이끌었습니다.
문제를 발견한 후 컨테이너를 다시 빌드하고 복원하고 게시해야 했습니다.
컨테이너에서 Docker 파일을 선택한 경우(예: fballiano/magentto2-apache-php)
파일 끝에 그가 다음 명령을 추가하는 것을 볼 수 있을 것입니다: 진실인 동안; 수면을 취하라 1; 완료.
자, 제가 권하는 것은, 당신이 이렇게 하는 것입니다.
docker container ls --all | grep 127
그런 다음 도커 이미지에 오류가 있는지 확인할 수 있습니다. 0으로 종료되는 경우 영원히 절전 모드로 전환되는 명령 중 하나가 필요할 수 있습니다.
도커 컨테이너는 사용자 단말기에 연결하는 데 도움이 되는 전경 프로세스가 없을 때 즉시 종료됩니다.예를 들어, 해당 컨테이너에 실행 중인 웹 서버가 없습니다.
전경 프로세스를 만드는 몇 가지 방법이 있습니다.이러한 방법 중 하나는 /dev/null로 리디렉션하여 컨테이너가 즉시 나가는 것을 방지하는 것입니다.그런 다음 -it 매개 변수와 함께 exec 명령을 사용하여 단말기에 연결할 수 있습니다.
docker run -d ubuntu tail -f /dev/null
docker exec -it 0ab99d8ab11c /bin/bash
$ 도커 런디 이미지
그건 효과가 있다.
docker logs
정보는 보통 나에게 도움이 되지 않습니다.앱의 로그가 도커 로그 출력과 동일할 때도 있고 그렇지 않을 때도 있습니다.
docker inspect
매우 명백한 오류가 아닌 한, 대부분의 경우에도 도움이 되지 않습니다.
에 당신의 ㅇEntrypoint
마지막 명령이 실패했거나 해당 명령에 의해 생성된 로그를 찾으면 됩니다.호스트의 볼륨을 통해 컨테이너 로그를 유지하고 로그를 확인합니다.
또는 대화형 환경을 선호하는 경우.컨테이너를 sleep 모드로 전환합니다.Entrypoint sleep(whatever long you like)
그런 하고 , docker exec -it container_idsh 를합니다를 합니다.Entrypoint
수동으로 명령하고, 무슨 일이 일어나고 있는지 확인합니다.
이미지가 리눅스이기 때문에 한 가지 확인해야 할 사항은 컨테이너에 사용되는 셸 스크립트에 유닉스 줄 끝이 있는지 확인하는 것입니다.끝에 ^M이 있으면 창 줄 끝입니다.이를 수정하는 한 가지 방법은 /usr/local/start-all.sh 에서 dos2 unix를 사용하여 윈도우에서 유닉스로 변환하는 것입니다.도커를 대화형 모드로 실행하면 다른 문제를 파악하는 데 도움이 될 수 있습니다.파일 이름 타이포 같은 것이 있을 수 있습니다.https://en.wikipedia.org/wiki/Newline 를 참조하십시오.
언급URL : https://stackoverflow.com/questions/28212380/why-docker-container-exits-immediately
'programing' 카테고리의 다른 글
document .touch device에 대한 클릭 기능 (0) | 2023.10.02 |
---|---|
테이블을 떨어뜨리면 MySQL이 중단됩니다. (0) | 2023.10.02 |
경량 C++ 이미지 라이브러리 (0) | 2023.10.02 |
Oracle sql null 값이 선택되지 않았습니다. (0) | 2023.10.02 |
ESNext란? (0) | 2023.10.02 |