我在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
,它就可以工作了。