Создание чистого приложения Go в Docker - PullRequest
1 голос
/ 04 мая 2019

Я пытаюсь создать веб-сервер Go в небольших образах Docker. В идеале чистое изображение содержит только само приложение Go (и, возможно, поддерживает веб-компоненты, но не среду Go-building).

Вот мой Dockerfile:

# golang:latest as build-env
FROM golang:latest AS build-env

RUN mkdir /app
ADD . /app/
WORKDIR /app
RUN cd /app && GO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o myapp .
# go build -o myapp

FROM scratch
COPY --from=build-env /app/myapp /app/images /

EXPOSE 8080
ENTRYPOINT /myapp

Он использует шаблон Docker Builder и скретч-изображение, которое представляет собой специальное пустое изображение докера.

Он работает нормально, но когда я его запускаю, я получаю:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused "exec: \"/bin/sh\": stat /bin/sh: no such file or directory": unknown.

ОБНОВЛЕНИЕ:

Таким образом, ENTRYPOINT необходимо изменить на форму exec:

ENTRYPOINT ["/myapp"]

Сделав это, я получаю новую ошибку:

standard_init_linux.go:207: exec user process caused "no such file or directory"

Использование небольшого образа Linux в качестве основы (т. Е. Alpine Linux) вместо нуля также не поможет:

$ docker run -it -p 8080:8080 go-web-docker-small            
standard_init_linux.go:207: exec user process caused "no such file or directory"

$ docker run -it -p 8080:8080 go-web-docker-small /bin/sh -i 
standard_init_linux.go:207: exec user process caused "no such file or directory"

Как это исправить? Thx!

Ответы [ 2 ]

9 голосов
/ 04 мая 2019

Последняя строка вашего Dockerfile -

ENTRYPOINT /myapp

Существует две формы инструкций ENTRYPOINT (и CMD и RUN). "exec form" выглядит как список JSON и предоставляет неинтерпретированный список аргументов для запуска в качестве основного процесса контейнера. «форма оболочки» не похожа на список JSON и неявно заключена в /bin/sh -c '...'.

Ваша ENTRYPOINT использует форму оболочки, а изображение FROM scratch не имеет оболочки, что приводит к получаемой вами ошибке. Вы можете изменить это на форму exec

ENTRYPOINT ["/myapp"]
2 голосов
/ 04 мая 2019

При сборке предоставленного вами Dockerfile я получаю следующую ошибку:

Сбой копирования: stat / var / lib / docker / overlay2 / cc1f8144192760ce7bf9cda7a7dfd0af16065901594c38609c813ea103cfd8d7 / merged / app / images: нет такого файла или каталога

Исправлена ​​команда копирования и несколько других, и изображение строится со следующим в Dockerfile

# golang:latest as build-env
FROM golang:latest AS build-env

RUN mkdir /app
ADD . /app/
WORKDIR /app
RUN cd /app && GO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o myapp .
# go build -o myapp

FROM scratch
COPY --from=build-env /app/myapp .

EXPOSE 8080
ENTRYPOINT ["./myapp"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...