为什么搬运工容器立即退出为什么搬运工容器立即退出(Why docker container exit

2019-05-10 11:10发布

我使用运行在后台的容器

 docker run -d --name hadoop h_Service

很快退出。 但是,如果我在前台运行,它工作正常。 我检查日志使用

docker logs hadoop

没有错误。 有任何想法吗?

DOCKERFILE

 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

Answer 1:

当其主要过程完成甲搬运工容器退出。

在这种情况下,当你将退出start-all.sh脚本结束。 我不知道有足够的了解Hadoop的告诉你怎么做,在这种情况下,但你需要或者留下一些运行在前台或使用进程管理器,例如runit或supervisord运行的进程。

我想你一定是搞错,如果你不指定它的工作-d ; 它应该有完全一样的效果。 我怀疑你有一个稍微不同的命令或使用启动它-it这将改变的东西。

一个简单的解决方案可能是添加的东西,如:

while true; do sleep 1000; done

在脚本的末尾。 我不但是,下面的这个脚本应该被监视它启动的进程。

(我应该说我偷了从代码https://github.com/sequenceiq/hadoop-docker/blob/master/bootstrap.sh )



Answer 2:

这并获得成功对我来说:

docker run -dit ubuntu

之后,我检查了使用正在运行的进程:

docker ps -a

再次附接在容器

docker attach CONTAINER_NAME

提示:在不停止容器类型退出: ^P^Q



Answer 3:

我想延长或我敢说,提高答复中提到camposer

当您运行

docker run -dit ubuntu

你基本上运行在交互模式背景容器。

当您安装并退出按CTRL + d(最常见的方式做到这一点)的容器,你停止容器,因为你杀了,你用上面的命令启动你的容器的主要过程。

使一个已经运行的容器的优势,我只想叉的bash的另一个进程,并获得通过运行一个伪TTY:

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


Answer 4:

每当我想一个容器熬夜完成脚本执行我添加后

&& tail -f /dev/null

在命令的末尾。 因此,它应该是:

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


Answer 5:

一个好的办法是启动你的进程和服务在后台运行它们,并使用了wait [n ...]在脚本结束命令。 在bash,等待命令强制当前进程:

等待每一个指定的进程,返回它的终止状态。 如果n没有给出,所有当前活动的子进程等待,返回状态是零。

我从塞巴斯蒂安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


Answer 6:

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.



Answer 7:

为什么搬运工容器立即退出?

如果要强制图片流连(为了调试的东西或检查文件系统的状态),则可以覆盖切入点将其更改为一个shell:

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


Answer 8:

添加

EXEC “$ @”

在我的shell脚本的结尾是我的修复!



Answer 9:

有许多可能的方式来使码头工人立即退出。 对我来说,这是我的问题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。 这驱使我的实际问题。

发现这个问题后,我不得不建立,恢复,再次发布我的容器。



Answer 10:

您可以运行使用此启动标记的容器。

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


Answer 11:

由于图像是Linux,有一件事是检查,以确保在容器中使用任何脚本,必须Unix行结尾。 如果他们在最后一个^ M那么他们是Windows行结尾。 解决这些问题的方法之一是与/usr/local/start-all.sh DOS2UNIX的将它们从窗口转换为UNIX。 运行在交互模式泊坞窗可以帮助找出其他问题。 你可以有一个文件名错字或东西。 看到https://en.wikipedia.org/wiki/Newline



文章来源: Why docker container exits immediately
标签: docker