Golang distroless Docker exec 失败:启用 CGO 时没有此类文件或目录

ast*_*urm 4 go cgo docker distroless

我试图获得一个在 docker 容器内运行的最小示例 go 应用程序。exec /app: no such file or directory但我在运行容器时不断出现。

我检查并仔细检查了构建和复制应用程序数据的图像中的所有路径,甚至使用交互式 shell 查看容器内部以验证我的路径app是否存在,但没有任何效果。

我的 Dockerfile:

# syntax=docker/dockerfile:1
# BUILD-STAGE
FROM golang:1.17-alpine as build

WORKDIR /go/app

COPY . .

RUN go mod download

RUN go build -o /go/bin/app

# RUN-STAGE
FROM gcr.io/distroless/static-debian11

COPY --from=build /go/bin/app .

EXPOSE 8080

CMD ["./app"]
Run Code Online (Sandbox Code Playgroud)

经过几个小时的尝试和错误,我终于尝试添加CGO_ENABLED=0到我的 go build 命令中......并且它起作用了!

我现在的问题是......到底为什么会发生这种情况?当我在隐式启用 CGO 的情况下构建图像时没有出现错误,我什至验证了二进制文件已复制到我的第二阶段!为什么使用CGO构建时运行时说没有这个文件,但禁用CGO构建时可以很容易找到它?

小智 12

您使用的图像不包含 libc 1,您在使用 时构建 go 应用程序CGO_ENABLED=1。正如1中所建议的,您可以使用gcr.io/distroless/base代替gcr.io/distroless/static. 构建应用程序时没有错误,因为 golang:1.17-alpine 包含 musl libc (类似于 libc 但更小)。然后,您尝试在不再有 libc 的环境中运行需要 libc 的应用程序。所以no such file错误。

谷歌容器工具