【问题标题】:Docker: Error response from daemon: rpc error: code = 2 desc = "oci runtime error: exec format error"Docker:来自守护进程的错误响应:rpc 错误:代码 = 2 desc =“oci 运行时错误:exec 格式错误”
【发布时间】:2016-04-15 17:33:39
【问题描述】:

我写了以下 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

【问题讨论】:

  • 对于初学者,我想你可能会混淆CMDRUN
  • Dockerfile 中有两个错误:CMD 应该是 RUN,并且 EXPOSE 不应该包含映射(只是端口)
  • 我做了你们建议的改变......但仍然是同样的问题。我在上面更新了我的代码。请查看更新的代码。
  • 另外,一个组合所有端口的EXPOSE 命令就足够了。
  • 试过了。但仍然是同样的错误。更新了我上面的代码。

标签: docker dockerfile boot2docker


【解决方案1】:

您是否发布了完整的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

【讨论】:

  • 我遇到了这个错误,我只是通过查看您的示例来修复。我的 shebang 错了,#/bin/bash
  • 只是对此的评论 - 它也发生在 Kubernetes 和 Readiness Probes 上。记住那些疯狂的shebangs!
  • 或者也可以将入口点更改为:ENTRYPOINT ["bash -c /entrypoint.sh"]。其他方式相同的解决方案。
【解决方案2】:

来自守护进程的错误响应:rpc error: code = 2 desc = “oci runtime error: exec format error”

在我的情况下,我在尝试在 32 位 ArchLinux(树莓派 2)上安装 docker 时遇到此错误。相反,我使用了HyperioOS,它变得更加流畅,安装起来也快了很多。但最后,大多数 docker 镜像与 32 位架构不兼容,they outline this 可能是导致此错误的原因。

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

【讨论】:

  • 我尝试了 Hyperio,但仍然收到上述错误。
  • 你是对的。如果您使用的是为 x86 芯片架构构建的 docker 映像,Hyperiot 无法解决该错误。最后我放弃了,因为要在 ARM 芯片组上运行任何东西,都需要在 ARM 芯片上编译。这意味着整个容器,一直到基础镜像都需要专门构建。而且大多数容器都不是为 ARM 构建的
【解决方案3】:

根据Cloudera's documentation,您应该以--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 (e.g. 7180 for Cloudera Manager, 80 for a guided tutorial)
-d                                Optional: runs the container in the background

【讨论】:

  • 完成了(并更新了上面的代码)但仍然是同样的错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 2019-04-30
  • 2020-01-11
  • 1970-01-01
  • 2019-06-13
  • 2018-05-28
相关资源
最近更新 更多