我正在按照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
这工作得很好。我在终端中看到了应用程序的输出。但是,我想将第二层图像从指南 ( gcr.io/distroless/base-debian10
) 中的 Distroless 图像切换到alpine:3
. 当我进行更改、构建新映像并尝试使用上面的相同命令运行新映像时,我收到有关用户不存在的错误:
docker: Error response from daemon: unable to find user nonroot: no matching entries in passwd file.
这对我来说很有意义。听起来 Distroless 映像有该用户,而 Alpine 映像没有。所以我USER nonroot:nonroot
从 Dockerfile 中删除了。所以此时,我的 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
我无法解决此错误。为什么以这种方式切换我的基本图像会导致此错误?