簡體   English   中英

為什么這個程序在容器中運行而不在主機上運行?

[英]Why does this program runs in a container but not on the host?

我正在做一個非常簡單的 docker 圖像和一個 c++ 編寫的程序,說你好。

我必須從虛擬機 Ubuntu 18.04, x86-64 構建可執行文件。

我在另一台機器上啟動了這個可執行文件,一個 Windows 10 64 位通過 cmd,但它拋出以下內容:

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

(說和這個 windows 版本不兼容)

當使用 git bash 啟動它時,它會拋出:

bash:./hello.exe:無法執行二進制文件:執行格式錯誤

我希望這個可執行文件不能在容器內運行,據我了解,它共享主機庫。 但令人驚訝的是,它確實有效:

$ docker run hello
Hello! This message is coming from a container

我想知道為什么它工作正常。 我一定是在什么地方誤會了什么。

dockerfile:

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 開始,從零開始在 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM