我正在用一个用c++编写的程序做一个非常简单的docker镜像,该程序会说你好。
我不得不从一个虚拟机Ubuntu 18.04,x86-64构建可执行文件。
我在另一台机器上通过cmd启动了这个可执行文件,一台Windows 10 64位,但它抛出了以下内容:
hello.exe与Windows实际版本不兼容exécutée。Vérifiz dans les Information Systemème de votre ordinateur,这是逻辑的联系人。
(表示与此windows版本不兼容(
当用gitbash启动它时,它抛出:
bash:/hello.exe:无法执行二进制文件:Exec格式错误
我原以为这个可执行文件不能在容器中运行,据我所知,它共享主机库。但令人惊讶的是,它确实有效:
$ docker run hello
Hello! This message is coming from a container
我想知道为什么它运行良好。我一定在什么地方误会了什么。
码头文件:
FROM scratch
ADD hello.exe /
CMD ["/hello.exe"]
c++程序:
#include <iostream>
using namespace std;
int main()
{
cout << "Hello! This message is coming from a container n ";
return 0;
}
用于构建可执行文件的g++命令:
g++ -o hello.exe -static main.cpp
您的Dockerfile使用"划痕;图像,这是一个最小的(使用非常基本的二进制文件来减小大小(。
根据Docker Hub的说法,scratch映像是Docker的保留空映像图像,这在构建基础图像(例如debian和busybox(或超最小图像。自Docker 1.5.0起,FROMscratch在Dockerfile中是一个非操作,不会创建额外的层。FROM scratch命令向构建发出信号我们希望Dockerfile中的下一个命令是图像中的第一个文件系统层。
FROM scratch
ADD hello.exe /
CMD ["/hello.exe"]
Scratch是一个保留的空linux映像,可以运行linux二进制文件。既然你在ubuntu上编译了你的程序,它就可以在linux容器上运行,而不是在你的windows机器上。
与其他用户一样,将扩展名更改为.exe不会使其成为windows可执行文件。
很好的解释:https://stackoverflow.com/a/41556921/2777988
进一步参考:https://codeburst.io/docker-from-scratch-2a84552470c8