Почему переключение базового образа в многоэтапной сборке Docker с distroless на alpine приводит к «вызванному пользовательскому процессу exec: нет такого файла или каталога»?
Я следую руководству на https://docs.docker.com/language/golang/build-images/ , чтобы узнать, как лучше всего выполнить многоэтапную сборку Docker для приложения Go. Я клонировал репо:
git clone https://github.com/olliefr/docker-gs-ping
И я выполнил команду в нижней части руководства, чтобы создать образ:
docker build -t docker-gs-ping:multistage -f Dockerfile.multistage .
Я также запустил собственную команду для запуска временного контейнера из образа:
docker run --rm docker-gs-ping:multistage
Это сработало нормально. Я вижу вывод приложения в своем терминале. Однако я хотел переключить образ второго слоя с образа Distroless в руководстве (
gcr.io/distroless/base-debian10
) к
alpine:3
. Когда я внес это изменение, создал новый образ и попытался запустить новый образ с помощью той же команды, что и выше, я получил сообщение об ошибке о том, что пользователь не существует:
docker: Error response from daemon: unable to find user nonroot: no matching entries in passwd file.
Это имело смысл для меня. Похоже, что в образе Distroless есть этот пользователь, а в образе Alpine — нет. Поэтому я удалил
USER nonroot:nonroot
из докерфайла. Итак, на данный момент вторая половина моего Dockerfile выглядит так:
##
## Deploy
##
FROM alpine:3
WORKDIR /
COPY --from=build /docker-gs-ping /docker-gs-ping
EXPOSE 8080
ENTRYPOINT ["/docker-gs-ping"]
Затем я создал новый образ и попытался запустить новый образ, используя ту же команду, что и выше. На этот раз я получил следующую ошибку:
standard_init_linux.go:228: exec user process caused: no such file or directory
У меня возникли проблемы с устранением этой ошибки. Почему переключение моего базового изображения таким образом вызывает эту ошибку?