-1

我正在按照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

我无法解决此错误。为什么以这种方式切换我的基本图像会导致此错误?

4

1 回答 1

1

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

于 2022-02-25T07:19:23.880 回答