我使用运行在后台的容器
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