我看到了
将我的helloWorldC图像作为容器运行时出现standard_init_linux.go:207:exec用户进程引起“ exec格式 错误”
错误。可能是什么问题呢?任何帮助表示赞赏。
我在带有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
$
答案 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
。