为什么在多阶段 Docker 构建中将基础映像从无发行版切换到 alpine 会导致"exec user process caused: no such file or directory"?



我在https://docs.docker.com/language/golang/build-images/学习为Go应用程序进行多级Docker构建的最佳方法。我克隆了回购:

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

这很好。我在终端中看到应用程序的输出。但是,我想将第二层图像从指南中的Distroles图像(gcr.io/distroless/base-debian10(切换到alpine:3。当我做出改变,构建一个新图像,并尝试使用上面的相同命令运行新图像时,我得到了一个关于用户不存在的错误:

docker: Error response from daemon: unable to find user nonroot: no matching entries in passwd file.

这对我来说很有道理。听起来Distroles的图片有那个用户,而Alpine的图片没有。所以我从Dockerfile中删除了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

我在排除此错误时遇到问题。为什么以这种方式切换我的基本图像会导致此错误?

我的基本图像不同步。用于构建二进制文件的阶段中使用的基本图像也需要是Alpine。如果我将指南中Dockerfile的第一行从FROM golang:1.16 AS build切换到FROM golang:1.16-alpine AS build,它就可以工作了。

最新更新