我有一个 Rust 二进制文件,想在容器中运行。当我使用时效果很好ubuntu
甚至gcr.io/distroless/cc
作为基本图像,但是当我尝试从scratch
图像,我遇到了一些问题。这显然是因为某些文件预计位于不存在的文件系统上。我能够弄清楚如何安装 CA 根证书,但现在我收到了一个不同的错误,似乎是在二进制文件尝试进行 DNS 查找时发生的。
我的 Dockerfile 看起来大多像这样(我删除了一些构建优化):
FROM rust:latest as cargo-build
WORKDIR /build
ENV RUSTFLAGS="-C target-feature=+crt-static"
COPY aggregator/ ./
RUN cargo build --release --target x86_64-unknown-linux-gnu
#####################################
FROM alpine:3.6 as ca-certificates
RUN apk add -U --no-cache ca-certificates
#####################################
FROM scratch
COPY --from=cargo-build /build/target/x86_64-unknown-linux-gnu/release/aggregator /entrypoint
COPY --from=ca-certificates /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
ENTRYPOINT [ "/entrypoint" ]
运行时(从 Rust 二进制文件)出现的错误是:
Error: Failed to load job description from S3
Caused by:
0: io error: error trying to connect: dns error: Device or resource busy (os error 16)
1: io error: error trying to connect: dns error: Device or resource busy (os error 16)
2: error trying to connect: dns error: Device or resource busy (os error 16)
3: dns error: Device or resource busy (os error 16)
4: Device or resource busy (os error 16)
我用 Google 搜索了该错误,并找到了另一个具有相同错误的 Rust/Docker 项目,但他们通过从scratch
to gcr.io/distroless/cc
作为基本图像,我想通过了解问题所在来避免这种情况。
查看文件系统,它似乎具有最小的网络配置,但我可能是错的。
.
├── dev
│ ├── console
│ ├── pts
│ └── shm
├── entrypoint
├── etc
│ ├── hostname
│ ├── hosts
│ ├── mtab -> /proc/mounts
│ ├── resolv.conf
│ └── ssl
│ └── certs
│ └── ca-certificates.crt
├── proc
└── sys
就像我写的那样,这与其他基本映像一起工作得很好,那么我缺少什么来让网络 Rust 二进制文件从“从头开始”运行呢?