我运行一个容器在后台使用

 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

当前回答

为什么docker容器立即退出?

如果你想强制映像挂起(为了调试某些东西或检查文件系统的状态),你可以重写入口点,将其更改为shell:

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

其他回答

由于映像是linux,因此要检查的一件事是确保容器中使用的任何shell脚本都有unix行结束符。如果它们的末尾有^M,那么它们就是窗口行结束符。修复它们的一种方法是在/usr/local/start-all.sh上使用dos2unix将它们从windows转换为unix。以交互模式运行docker可以帮助解决其他问题。可能是文件名打错了。参见https://en.wikipedia.org/wiki/Newline

有许多可能的方法可以使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。这让我想到了真正的问题。

在发现问题后,我必须重新构建、恢复、发布我的容器。

把这个添加到Dockerfile的末尾:

CMD tail -f /dev/null

示例Docker文件:

FROM ubuntu:16.04

# other commands

CMD tail -f /dev/null

参考

我在最后添加了read shell语句。这将保持容器的主进程——启动shell脚本——运行。

我想扩展或者我敢说,改进camposer提到的答案

当你奔跑

docker run -dit ubuntu

您基本上是以交互模式在后台运行容器。

当你通过CTRL+D(最常用的方法)附加并退出容器时,你停止了容器,因为你刚刚杀死了用上面的命令启动容器的主进程。

利用一个已经运行的容器,我只需要fork bash的另一个进程,并通过运行来获得一个伪TTY:

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