Docker:来自守护进程的错误响应:rpc错误:code = 2 desc =“oci运行时错误:exec格式错误”

我写了下面的docker文件

FROM cloudera/quickstart MAINTAINER abhishek "http://www.foobar.com" ADD ./SparkIntegrationTestsAssembly.jar / ADD ./entrypoint.sh / ADD ./twitter.avro / EXPOSE 8020 50070 50010 50020 50075 8030 8031 8032 8033 8088 8040 8042 10020 19888 11000 8888 18080 7077 RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] 

我使用命令build立了我的图像

 docker build --tag foobar:auto . 

这个命令的输出是

 Sending build context to Docker daemon 93.1 MB Step 1 : FROM cloudera/quickstart ---> 4239cd2958c6 Step 2 : MAINTAINER abhishek "http://www.foobar.com" ---> Running in 3ad11fe4aa77 ---> 22a2f2840475 Removing intermediate container 3ad11fe4aa77 Step 3 : ADD ./SparkIntegrationTestsAssembly.jar / ---> 1ebae604e632 Removing intermediate container 0f047ec885a8 Step 4 : ADD ./entrypoint.sh / ---> 880cf4ff22aa Removing intermediate container 0808ba44c97a Step 5 : ADD ./twitter.avro / ---> 6978f2adf422 Removing intermediate container 43d812aaa3ae Step 6 : EXPOSE 8020 50070 50010 50020 50075 8030 8031 8032 8033 8088 8040 8042 10020 19888 11000 8888 18080 7077 ---> Running in af90e145f295 ---> 6fcfb5ad934c Removing intermediate container af90e145f295 Step 7 : RUN chmod +x /entrypoint.sh ---> Running in 4696faa2d330 ---> 843ee5165937 Removing intermediate container 4696faa2d330 Step 8 : ENTRYPOINT /entrypoint.sh ---> Running in 4caf6e225007 ---> 81cca7ee3198 Removing intermediate container 4caf6e225007 Successfully built 81cca7ee3198 

但是,当我尝试运行我的容器使用

 docker run --hostname=quickstart.cloudera --rm --privileged=true -t -i -p "8020:8020" -p "50070:50070" -p "50010:50010" -p "50020:50020" -p "50075:50075" -p "8030:8030" -p "8031:8031" -p "8032:8032" -p "8033:8033" -p "8088:8088" -p "8040:8040" -p "8042:8042" -p "10020:10020" -p "19888:19888" -p "11000:11000" -p "8888:8888" -p "18080:18080" -p "7077:7077" foobar:auto 

我得到一个错误

 docker: Error response from daemon: rpc error: code = 2 desc = "oci runtime error: exec format error". 

我的entrypoint.sh文件看起来像

 /usr/bin/docker-quickstart service hadoop-hdfs-namenode restart hdfs dfs -mkdir -p input hdfs dfs -put /twitter.avro /input/twitter.avro spark-submit --class com.abhi.HelloWorld --master local[1] SparkIntegrationTestsAssembly.jar /input/twitter.avro /output 

你发布了完整的entrypoint.sh吗? 内核尝试通过查看可执行文件的第一个字节来识别文件types。 对于脚本你需要添加一个所谓的shebang线。 您可能需要在entrypoint.sh顶部添加一个shebang行,例如:

 #!/bin/sh /usr/bin/docker-quickstart service hadoop-hdfs-namenode restart hdfs dfs -mkdir -p input hdfs dfs -put /twitter.avro /input/twitter.avro spark-submit --class com.abhi.HelloWorld --master local[1] SparkIntegrationTestsAssembly.jar /input/twitter.avro /output 

守护进程的错误响应:rpc错误:code = 2 desc =“oci运行时错误:exec格式错误”

在我的情况下,当我尝试在32位ArchLinux(一个覆盆子pi 2)上安装docker的时候出现了这个错误。 相反,我使用HyperioOS ,它变得更顺畅,安装起来更快。 但最终,大多数docker图像与32位体系结构不兼容,并将其列为可能导致此错误的原因。

在这里,我们在Raspberry Pi上运行Docker。 所以这里的CPU架构是ARM而不是Intel或AMD的x86 / x64。 因此,您使用的基于Docker的应用程序必须专门针对ARM体系结构进行打包! 为x86 / x64打包的基于Docker的应用程序将不起作用,并将导致错误

根据Cloudera的文档,你应该用--hostname--priviliged来启动它

从文档

 docker run --hostname=quickstart.cloudera --privileged=true -t -i [OPTIONS] [IMAGE] /usr/bin/docker-quickstart 

所需标志和其他选项的说明如下表所示:

 --hostname=quickstart.cloudera Required: pseudo-distributed configuration assumes this hostname --privileged=true Required: for HBase, MySQL-backed Hive metastore, Hue, Oozie, Sentry, and Cloudera Manager, and possibly others -t Required: once services are started, a Bash shell takes over and will die without this -i Required: if you want to use the terminal, either immediately or attach later -p 8888 Recommended: maps the Hue port in the guest to another port on the host -p [PORT] Optional: map any other ports (eg 7180 for Cloudera Manager, 80 for a guided tutorial) -d Optional: runs the container in the background