Ошибка при запуске частного образа докера: standard_init_linux.go: 207: пользовательский процесс exec вызвал «ошибку формата exec» - PullRequest
1 голос
/ 10 марта 2019

Я вижу

standard_init_linux.go: 207: пользовательский процесс exec вызвал "exec формат ошибка "

ошибка при запуске моего изображения helloWorldC в качестве контейнера. В чем может быть проблема? Любая помощь приветствуется.

Я попытался выполнить следующие шаги в MacOS с версией сообщества Docker Desktop.

Написал простую программу на 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 
 ###############################################################
$

Затем создал минималистичный Dockerfile для моего исполняемого файла 'helloWorldC' -

$ cat Dockerfile 
FROM scratch
ADD helloWorldC /
CMD ["/helloWorldC"]
$

Встроенный образ докера -

$ 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 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
$

Ответы [ 2 ]

1 голос
/ 10 марта 2019

Я хотел бы предложить альтернативное решение, которое позволит вам скомпилировать код, а также сохранить минимальное конечное изображение по вашему желанию.Это можно сделать с помощью многоступенчатых сборок , предоставленных Docker.Таким образом, ваш 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 
 ###############################################################
0 голосов
/ 10 марта 2019

Вы создали динамически связанный исполняемый файл, а затем попытались запустить его в контейнере без каких-либо его библиотек или даже компоновщика. Быстрое решение состоит в том, чтобы вызвать clang++ с флагом -static, но учтите, что glibc на самом деле не предназначен для такого использования, поэтому вы, вероятно, захотите использовать вместо него musl или какой-либо другой libc, если это больше чем игрушка.

Кроме того, вы, похоже, пытаетесь скомпилировать бинарный файл Linux на хосте Mac. Если вы хотите, чтобы это работало, вам нужно сделать кросс-компиляцию. Кроме того, вы можете запустить clang на хосте Linux, где он будет работать.

...