我运行一个容器在后台使用
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
一个很好的方法是启动你的进程和服务,在后台运行它们,并使用等待[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
有许多可能的方法可以使docker立即退出。对我来说,问题出在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为什么退出。
简单来说,如果你有
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
(还要注意当为true时如何写作。经常会看到一些愚蠢的东西,比如while [true]或while[1],它们碰巧是有用的,但它们的意思可能不是作者想象的那样。)
如果您只需要运行一个容器而不退出,那么只需运行即可
docker run -dit --name MY_CONTAINER MY_IMAGE:latest
然后
docker exec -it MY_CONTAINER /bin/bash
你会在容器的bash shell中,它不应该退出。
或者如果退出发生在docker-compose期间,则使用
command: bash -c "MY_COMMAND --wait"
正如这里的其他两个答案所述(虽然不是很清楚地指docker-compose,这就是为什么我仍然再次提到“等待”技巧)。
我试过了,再等一会儿,没有效果。它一定是一些自己编写的python或shell代码的参数。如果我有时间,我会去查的。它应该是一个很好的默认值,因为它是由专业人员编写的。也许这也只是掩盖了这个Q/A中的另一个答案。