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

Docker standard_init_linux.go:211:exec用户进程导致Alpine上“没有这样的文件或目录”,docker,alpine,Docker,Alpine,我正在尝试按照使用来精简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

我正在尝试按照使用来精简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"

发生了什么,我该如何解决这个问题?

这个问题已经出现过多次,而且这个错误似乎有很多可能的原因。有的是,有的是。然而,在我的情况下,这是一个不同的原因

发生此错误是因为问题中的内置二进制文件/whatwg/wattsi/bin取决于已安装的系统。据推测,在运行时,有人在寻找系统的glibc,但Alpine-Linux没有可用的glibc。相反,它使用musl-libc,这是一种更简单但不受欢迎的方法

最简单的修复方法是使用具有glibc可用的不同基础映像。您可以使用构建器映像69.2 MiB中使用的debian:stable slim,但更小的是Google的gcr.io/distroless/base 16.9 MiB。这仍然比alpine:最新的5.61 MiB或无分发服务器的静态映像1.82 MiB大,但还不错


可能还有其他解决方案,例如讨论在Alpine Linux上设置glibc的方法。或者,您可以找出如何将编译器/链接器更改为针对系统libc进行链接,即在Alpine Linux上使用musl-libc,而不是专门假设glibc的存在。但就我而言,gcr.io/distroless/base工作得很好。

这个问题已经出现过多次,而且这个错误似乎有很多可能的原因。有的是,有的是。然而,在我的情况下,这是一个不同的原因

发生此错误是因为问题中的内置二进制文件/whatwg/wattsi/bin取决于已安装的系统。据推测,在运行时,有人在寻找系统的glibc,但Alpine-Linux没有可用的glibc。相反,它使用musl-libc,这是一种更简单但不受欢迎的方法

最简单的修复方法是使用具有glibc可用的不同基础映像。您可以使用构建器映像69.2 MiB中使用的debian:stable slim,但更小的是Google的gcr.io/distroless/base 16.9 MiB。这仍然比alpine:最新的5.61 MiB或无分发服务器的静态映像1.82 MiB大,但还不错


可能还有其他解决方案,例如讨论在Alpine Linux上设置glibc的方法。或者,您可以找出如何将编译器/链接器更改为针对系统libc进行链接,即在Alpine Linux上使用musl-libc,而不是专门假设glibc的存在。但就我而言,gcr.io/distroless/base工作得很好。

一个重要的更正:Alpine没有安装glibc GNU libc,它确实有一个libc。libc提供了标准的C库和posixapi,因此内置于任何Linux发行版中。glibc是事实上的标准libc实现。Alpine Linux构建在musl libc库的基础上,这是一个最小且严格的POSIX libc实现,实际上与glibc不兼容。谢谢@valiano。我已经更新了答案,使之更符合这些思路。一个重要的更正是:Alpine没有安装glibc GNU libc,它确实有一个libc。libc提供了标准的C库和posixapi,因此内置于任何Linux发行版中。glibc是事实上的标准libc实现。Alpine Linux构建在musl libc库的基础上,这是一个最小且严格的POSIX libc实现,实际上与glibc不兼容。谢谢@valiano。我已经更新了答案,使其更符合这些原则。