我正在使用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
答案 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