standard_init_linux.go:211: exec 用户进程在 Alpine 上导致“没有这样的文件或目录”

Dom*_*nic 3 docker alpine-linux

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

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"]
Run Code Online (Sandbox Code Playgroud)

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

standard_init_linux.go:211: exec user process caused "no such file or directory"
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?我该如何解决这个问题?

Dom*_*nic 5

这个问题已经出现过多次,这个错误似乎有很多可能的原因。有些bash 脚本中的 shebang 指令丢失或错误,或者复制到卷的文件中的 Windows 行结尾丢失或错误。然而,就我而言,这是出于不同的原因。

发生此错误是因为构建的二进制文件(/whatwg/wattsi/bin在问题中)取决于安装了glibc 的系统。想必在运行的时候,有东西在寻找系统的glibc,但是Alpine Linux并没有可用的glibc。(相反,它使用 musl-libc,它更简单,但不太流行。)

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

可能还有其他解决方案,例如这个问题讨论了在 Alpine Linux 上设置 glibc 的方法。或者,您可以弄清楚如何更改编译器/链接器以链接到系统 libc(即 Alpine Linux 上的 musl-libc),而不是专门假设 glibc 的存在。但对于我的情况来说,gcr.io/distroless/base效果很好。