Не удается запустить Docker-контейнер для простой программы - PullRequest
0 голосов
/ 31 января 2019

Я планирую использовать Docker для проекта C ++.Я добавил простую программу на С ++, которая выводит «hello world» для проверки.Затем я скомпилировал его

g++ -o helloworldexecutable helloword.cpp

Добавил Dockerfile в корневую папку проектов. Dockerfile включает в себя:

FROM scratch
ADD helloworldexecutable / 
CMD helloworldexecutable

Когда я запускаю: sudo docker build --tag helloworldexecutable ., это показывает, что сборка прошла успешно.Я вижу это изображение, используя sudo docker images Я могу запустить sudo docker run hello-world Но при запуске sudo docker run helloexecutable Я получаю сообщение об ошибке:

docker: Ошибка ответа от демона: Ошибка создания среды выполнения OCI: container_linux.go: 344: запуск процесса контейнера вызвал "exec: \" / bin / sh \ ": stat / bin / sh: нет такого файла или каталога": неизвестно.

В чем может быть проблема?

1 Ответ

0 голосов
/ 31 января 2019

Cpp файл:

#include <iostream>
using namespace std;

int main() 
{
    cout << "Hello, World!";
    return 0;
}

Компиляция (подробности о флаге --static приведены ниже):

g++ -o helloworldexecutable --static helloword.cpp

Dockerfile:

FROM scratch
ADD helloworldexecutable / 
CMD ["/helloworldexecutable"]

Результат:

$ docker build -t testcpp .
Sending build context to Docker daemon  2.254MB
Step 1/3 : FROM scratch
 ---> 
Step 2/3 : ADD helloworldexecutable /
 ---> Using cache
 ---> 0dd28bce4aed
Step 3/3 : CMD ["/helloworldexecutable"]
 ---> Running in 170a865b9527
Removing intermediate container 170a865b9527
 ---> 8a09e556c290
Successfully built 8a09e556c290
Successfully tagged testcpp:latest


$ docker container run --rm testcpp
Hello, World!$

С Создание образа Docker с нуля :

Создание статического двоичного файла

... Но наиболее высокийприложения уровня зависят от большого количества системных библиотек (таких как glibc, musl, klibc и т. д.) и множества зависимостей времени выполнения, таких как Python или Node.js или Java Runtime.Двоичный файл приложения не имеет всех доступных библиотек, но когда он запускает выполнение, он вызывает эти библиотеки из операционной системы хоста.

Поскольку мы пытаемся создать образ с нуля, мы не будемполучать эти тонкости.Поэтому наше приложение должно быть статическим файлом или отдельным исполняемым файлом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...