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)
这是怎么回事?我该如何解决这个问题?
这个问题已经出现过多次,这个错误似乎有很多可能的原因。有些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效果很好。
| 归档时间: |
|
| 查看次数: |
1301 次 |
| 最近记录: |