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

Я пытаюсь создать контейнер с моим двоичным файлом Go для использования в качестве переносчика базы данных.Если я запускаю бинарный файл, он работает отлично, но я с трудом помещаю его в контейнер и запускаю в моем стеке docker-compose.

Ниже приведен мой Dockerfile.

FROM golang:1.11 AS build_base

WORKDIR /app

ENV GO111MODULE=on
# We want to populate the module cache based on the go.{mod,sum} files.
COPY go.mod .
COPY go.sum .
RUN go mod download

FROM build_base AS binary_builder
# Here we copy the rest of the source code
COPY . .

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build

#In this last stage, we start from a fresh Alpine image, to reduce the image size and not ship the Go compiler in our production artifacts.
FROM alpine AS database-migrator
# We add the certificates to be able to verify remote instances
RUN apk add ca-certificates
COPY --from=binary_builder /app /app

ENTRYPOINT ["/app/binary-name"]

Когда я запускаю свой стек docker-compose, база данных MySQL корректно настраивается, но я получаю эту ошибку в журналах для моего контейнера переноса базы данных.

data-migrator_1 |standard_init_linux.go: 190: пользовательский процесс exec вызвал «ошибку формата exec»

1 Ответ

1 голос
/ 22 апреля 2019

Проверьте, похоже ли это на containers/buildah выпуск 475 :

Я думаю, это потому, что система не знает, как выполнить файл.
К вашему сведению: Какова подходящая строка Go shebang?

Также следует учитывать разницу между формой оболочки и формой exec CMD / ENTRYPOINT в Dockerfile.

просто добавление #!/bin/bash в мой файл точки входа решило проблему.

Или:

Оказывается, #!/bin/bash было в моем файле точки входа, нотак как я скопировал и вставил в этот файл, первая строка была новой строкой, а не #!/bin/bash, фактически игнорируя ее.
Если это кому-то тоже поможет: удалил пустую строку и все работало нормально.

Или:

В случае, если кому-то это покажется полезным, вы можете получить эту проблему, если ваш сценарий оболочки использует CRLF для окончания строки и / или UTF-8 с спецификацией (например, если высоздал файл сценария оболочки в Visual Studio).
Изменение только на LF и прямой UTF-8 исправили это для меня.

Или (возможно, не ваш случай, но будет полным):

Для тех, кто получил ошибку standard_init_linux.go:190: exec user process caused "no such file or directory" после применения этого исправления, вы, вероятно, находитесь на альпийскомбазовое изображение, которое не поставляется с bash.

Замена #!/bin/bash на #!/bin/sh поможет!

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