gpt4 book ai didi

c++ - 为什么这个程序在容器中运行而不在主机上运行?

转载 作者:行者123 更新时间:2023-12-04 19:06:35 26 4
gpt4 key购买 nike

我正在做一个非常简单的 docker 镜像,它带有一个打招呼的 c++ 编写程序。
我必须从虚拟机 Ubuntu 18.04、x86-64 构建可执行文件。
我通过 cmd 在另一台机器上启动了这个可执行文件,一个 Windows 10 64 位,但它抛出以下内容:

hello.exe n’est pas compatible avec la version de Windows actuellementexécutée. Vérifiez dans les informations système de votre ordinateur,puis contactez l’éditeur de logiciel.


(说它与这个 windows 版本不兼容)
使用 git bash 启动它时,它会抛出:

bash: ./hello.exe: cannot execute binary file: Exec format error


我希望这个可执行文件不能在容器内运行,据我了解,它共享主机库。但令人惊讶的是,它确实有效:
$ docker run hello
Hello! This message is coming from a container
我想知道为什么它工作正常。我一定是在什么地方误会了什么。
docker 文件:
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 使用“scratch”图像,这是一个最小的(使用非常基本的二进制文件来减小大小)。

According to Docker Hub, the scratch image is Docker’s reserved emptyimage, which is useful in the context of building base images (such asdebian and busybox) or super minimal images. As of Docker 1.5.0, FROMscratch is a no-op in the Dockerfile, and will not create an extralayer in our image. The FROM scratch command signals to the buildprocess that we want the next command in the Dockerfile to be thefirst filesystem layer in our image.

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

关于c++ - 为什么这个程序在容器中运行而不在主机上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67986573/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com