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

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

我写了下面的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"]

我使用命令

构建了我的镜像
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

根据 Cloudera's documentation 你应该从 --hostname--priviliged

开始

来自文档

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

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

--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 (e.g. 7180 for Cloudera Manager, 80 for a guided tutorial)
-d                                Optional: runs the container in the background

您 post 完成 entrypoint.sh 了吗? 内核试图通过查看可执行文件的前几个字节来识别文件类型。对于脚本,您需要添加所谓的 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

Error response from daemon: rpc error: code = 2 desc = “oci runtime error: exec format error”

就我而言,我在尝试在 32 位 ArchLinux(raspberry pi 2)上安装 docker 时遇到此错误。相反,我使用 HyperioOS and it went alot smoother and was so much faster to install. But in the end, most docker images are not compatible with 32 bit architectures and they outline this 作为出现此错误的可能原因。

Here we run Docker on a Raspberry Pi. So the CPU architecture here is ARM rather than x86/x64 by Intel or AMD. Thus, Docker-based apps you use have to be packaged specifically for ARM architecture! Docker-based apps packaged for x86/x64 will not work and will result in an error