【问题标题】:standard_init_linux.go:211: exec user process caused "no such file or directory" on Alpinestandard_init_linux.go:211: exec 用户进程在 Alpine 上导致“没有这样的文件或目录”
【发布时间】:2020-09-11 09:50:50
【问题描述】:

我正在尝试按照使用 multi-stage builds 精简 Docker 文件的说明进行操作。特别是,我尝试使用以下 Dockerfile 将构建的可执行文件从构建器映像复制到 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"

发生了什么,我该如何解决?

【问题讨论】:

    标签: docker alpine


    【解决方案1】:

    这个问题出现过多次,这个错误似乎有很多可能的原因。有些是missing or wrong shebang instructions in any bash scripts,或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),而不是专门假设 glibc 的存在。但就我而言,gcr.io/distroless/base 工作得很好。

    【讨论】:

    • 一个重要的更正:Alpine 没有安装 glibc (GNU libc) - 它有一个 libc。 libc 提供标准 C 库和 POSIX API,因此内置于任何 Linux 发行版中。 glibc 是事实上的标准 libc 实现。 Alpine Linux 建立在 musl-libc 库之上,这是一个最小且严格的 POSIX libc 实现,并且确实与 glibc 不兼容。
    • 谢谢@valiano。我已经更新了答案,使其更加符合这些原则。
    猜你喜欢
    • 2020-08-03
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 2018-12-07
    • 2020-10-25
    • 2019-01-01
    相关资源
    最近更新 更多