一尘不染

为什么Docker容器会立即退出

docker

我在后台运行一个容器

 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

阅读 393

收藏
2020-06-17

共1个答案

一尘不染

一个Docker容器的主要过程完成后退出。

在这种情况下,它将在start- all.sh脚本结束时退出。我对hadoop不太了解,无法在这种情况下告诉您如何做,但是您需要要么在前台运行某些东西,要么使用诸如runit或supervisor之类的流程管理器来运行流程。

我认为,如果不指定-d,您一定会误以为它会起作用;它应该具有完全相同的效果。我怀疑您是用稍微不同的命令启动了它,或者使用-it它会改变某些情况。

一个简单的解决方案可能是添加如下内容:

while true; do sleep 1000; done

到脚本末尾。但是我不喜欢这样,因为脚本实际上应该监视启动的进程。

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

2020-06-17