运行私有docker映像时出错:standard_init_linux.go:207:exec用户进程导致“ exec格式错误”

时间:2019-03-09 23:25:51

标签: macos docker dockerfile docker-desktop

我看到了

  

standard_init_linux.go:207:exec用户进程引起“ exec格式   错误”

将我的helloWorldC图像作为容器运行时出现

错误。可能是什么问题呢?任何帮助表示赞赏。

我在带有Docker Desktop社区版的MacOS上尝试了以下步骤。

编写一个简单的C ++程序,编译并创建一个可执行文件。

$ cat helloWorldC.cc
#include<iostream>
using namespace std;
int main() {
 cout << "###############################################################\n";
 cout << "\tHello from basic C++ HelloWorld Dockerized image \n ";
 cout << "###############################################################\n";
 return 0;
}
$

$ clang++ -o helloWorldC helloWorldC.cc

$ ./helloWorldC 
###############################################################
 Hello from basic C++ HelloWorld Dockerized image 
 ###############################################################
$

然后为我的“ helloWorldC”可执行文件创建了一个简约的Dockerfile-

$ cat Dockerfile 
FROM scratch
ADD helloWorldC /
CMD ["/helloWorldC"]
$

构建docker映像-

$ docker build --tag helloworldc .
Sending build context to Docker daemon 550.9kB
Step 1/3 : FROM scratch
---> 
Step 2/3 : ADD helloWorldC /
---> 35c21b2c67c9
Step 3/3 : CMD ["/helloWorldC"]
---> Running in bc22fbf4bf85
Removing intermediate container bc22fbf4bf85
---> 96e44669461a
Successfully built 96e44669461a
Successfully tagged helloworldc:latest
$

已成功创建Docker映像-

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
.
.
helloworldc latest 96e44669461a About a minute ago 15.4kB
registry 2 f32a97de94e1 44 hours ago 25.8MB
.
.
$

运行Docker容器时,出现以下错误。

$ docker run helloworldc
standard_init_linux.go:207: exec user process caused "exec format error"
$ 

以下是我的docker版本-

$ docker version
Client: Docker Engine - Community
 Version:           18.09.1
 API version:       1.39
 Go version:        go1.10.6
 Git commit:        4c52b90
 Built:             Wed Jan  9 19:33:12 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.1
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       4c52b90
  Built:            Wed Jan  9 19:41:49 2019
  OS/Arch:          linux/amd64
  Experimental:     false
$

2 个答案:

答案 0 :(得分:1)

我想提出一个替代解决方案,它使您能够编译代码,并根据需要使最终图像保持最小。这可以使用docker提供的multi-stage builds来完成。因此,您的Dockerfile可以像这样:

FROM gcc:5 as builder
COPY ./helloWorldC.cc /helloWorldC.cc
RUN g++ -o helloWorldC -static helloWorldC.cc && chmod +x helloWorldC

FROM scratch
COPY --from=builder /helloWorldC /helloWorldC
CMD ["/helloWorldC"]

然后在构建后,您将获得一个最小的图像,如下所示:

REPOSITORY      TAG    IMAGE ID     CREATED        SIZE
helloworldimage latest 89800885c997 22 seconds ago 2.17MB

最后,您可以毫无问题地运行它:

docker run --rm -it helloworldimage:latest
###############################################################
    Hello from basic C++ HelloWorld Dockerized image 
 ###############################################################

答案 1 :(得分:0)

您创建了一个动态链接的可执行文件,然后尝试在没有任何库甚至链接程序的容器中运行它。一种快速修复方法是使用clang++标志调用-static,但是请注意,glibc并不是真的要那样使用,因此您可能想使用musl或其他libc如果不仅仅是玩具。

此外,您似乎正在尝试在Mac主机上编译Linux二进制文件。如果您希望这样做,则需要交叉编译。或者,您可以在将要运行的Linux主机上运行clang