基于 Golang 的 docker 镜像构建可以工作,但不能基于暂存的镜像

hta*_*irt 4 go docker

我可以在使用golang:1.13base 时运行 Web 应用程序的 docker 映像,但在使用scratch. 工作的 Dockerfile 是:

FROM golang:1.13 AS builder
WORKDIR /app
COPY . .
RUN go build -o server

FROM golang:1.13
COPY --from=builder /app/server /app/server
COPY --from=builder /app/credentials/service-account.json /app/credentials/service-account.json
ENTRYPOINT ["/app/server"]
Run Code Online (Sandbox Code Playgroud)

但是当我将最终图像库更改为scratch(第 6 行)时,如下所示:

FROM golang:1.13 AS builder
WORKDIR /app
COPY . .
RUN go build -o server

FROM scratch # <-- CHANGED
COPY --from=builder /app/server /app/server
COPY --from=builder /app/credentials/service-account.json /app/credentials/service-account.json
ENTRYPOINT ["/app/server"]
Run Code Online (Sandbox Code Playgroud)

我收到一个standard_init_linux.go:211: exec user process caused "no such file or directory"错误。

为了构建 docker 映像,我使用docker build -t myimage .,为了运行该映像,我使用docker run --rm -p 8080:8080 myimage:latest

该应用程序是一个基于 Go 的 Web API,它使用 Gin 框架和 GCP 服务帐户来访问 GCP 服务(我在构建时复制的 JSON 文件。)

col*_*tor 5

如果您没有使用 CGO(如 @jakub 提到的),请尝试在构建中禁用 CGO。

所以改变你的这一行Dockerfile

#RUN go build -o server
RUN CGO_ENABLED=0 go build -o server
Run Code Online (Sandbox Code Playgroud)

  • 这是构建优化。启用 CGO 后,在本地计算机上构建的速度将会更快。它将使用您的本机操作系统的 DNS 解析器等。那么您的问题中发生了什么:您正在构建“golang”docker 映像 - 它是本机库。将该构建可执行文件传输到临时(空)映像失败,因为(golang 映像)操作系统库丢失。`CGO_ENABLED=0` 构建一个独立的可执行文件,没有外部库依赖项 - 非常适合 `scratch`。 (3认同)