standard_init_linux.go:211: exec 用户进程在 Alpine 上导致 "no such file or directory"

standard_init_linux.go:211: exec user process caused "no such file or directory" on Alpine

我正在尝试按照有关使用 multi-stage builds 精简 Docker 文件的说明进行操作。特别是,我尝试使用以下 Docker 文件将构建的可执行文件从构建器映像复制到 alpine:latest 中:

FROM debian:stable-slim AS builder

RUN apt-get update && \
    apt-get install -y --no-install-recommends fp-compiler fp-units-fcl fp-units-net libc6-dev

COPY src /whatwg/wattsi/src
RUN /whatwg/wattsi/src/build.sh

FROM alpine:latest
COPY --from=builder /whatwg/wattsi/bin /whatwg/wattsi/bin

ENTRYPOINT ["/whatwg/wattsi/bin/wattsi"]

但是,当我尝试使用 docker run 运行 生成的 docker 图像时,出现错误

standard_init_linux.go:211: exec user process caused "no such file or directory"

这是怎么回事,我该如何解决?

这个问题已经多次出现,这个错误似乎有很多可能的原因。有些是 , or Windows line endings in files copied to the volume。但是,就我而言,这是出于不同的原因。

发生此错误是因为构建的二进制文件(问题中的 /whatwg/wattsi/bin)取决于安装了 glibc 的系统。据推测,当 运行 时,某些东西正在寻找系统的 glibc,但 Alpine Linux 没有可用的 glibc。 (相反,它使用 musl-libc,它更简洁,但不太受欢迎。)

最简单的解决方法是使用具有可用 glibc 的不同基础映像。您可以使用构建器映像中使用的 debian:stable-slim (69.2 MiB),但较小的是 Google 的 Distroless base image gcr.io/distroless/base (16.9 MiB) .这仍然比 alpine:latest (5.61 MiB) 或 Distroless 静态图像 (1.82 MiB) 大,但还不错。

可能还有其他解决方案,例如this question 讨论了在 Alpine Linux 上设置 glibc 的方法。或者,您可以想出如何针对系统 libc(即 Alpine Linux 上的 musl-libc)将 compiler/linker 更改为 link,而不是专门假设 glibc 的存在。但就我而言,gcr.io/distroless/base 工作得很好。