是否可以在docker文件中间执行CMD?

时间:2015-01-22 04:35:11

标签: hadoop docker boot2docker dockerfile

我正在使用docker安装hadoop-0.20.2。我有两个文件用于java安装,另一个用于hadoop安装。我正在使用CMD命令启动服务

 cmd ["path/to/start-all.sh"]

现在,我想编写第三个执行示例Map-Reduce作业的dockerfile。但问题是

第三个docker文件依赖于第二个hadoop-docker文件。例如:

 FROM sec_doc_file

 RUN /bin/hadoop fs -mkdir input

它需要hadoop服务。但只有在运行第二个docker文件后才能启动hadoop服务。但我想在启动MR作业之前将其作为第三个docker文件的一部分运行?可能吗?如果是,请提供一个例子。如果没有,那么其他可能性是什么?

 #something like

 From sec_doc_file

 #Start_Service

 RUN /bin/hadoop fs -mkdir input

 #continue_map_reduce_job

1 个答案:

答案 0 :(得分:1)

用作新容器基础的docker镜像是文件的基础,而不是应该运行的进程。要做你想做的事,你需要在dockerbuild期间启动你需要的进程并运行命令来正确设置。每个RUN创建一个新的AUFS层,但不保留以前可能运行的服务。因此,如果您需要服务在docker build期间执行某些设置,则需要在一行中运行它(连接命令或使用自定义脚本)。例如:

FROM Gops/sec_doc_file
RUN path/to/start-all.sh && /bin/hadoop fs -mkdir input

因此,在docker build期间设置HDFS文件夹和文件时,您需要运行hdfs守护程序并在同一RUN命令中执行您希望的操作:

RUN /etc/hadoop/hadoop-env.sh &&\
    /opt/hadoop/sbin/start-dfs.sh &&\
    /opt/hadoop/bin/hdfs dfs -mkdir input