我的Rust应用程序dockerfile如下,它工作正常
# Generate a recipe file for dependencies
FROM rust as planner
WORKDIR /app
RUN cargo install cargo-chef
COPY . .
RUN cargo chef prepare --recipe-path recipe.json
# Building our dependencies
FROM rust as cacher
WORKDIR /app
RUN cargo install cargo-chef
COPY --from=planner /app/recipe.json recipe.json
RUN cargo chef cook --release --recipe-path recipe.json
# Builder Image
FROM rust as builder
COPY . /app
WORKDIR /app
COPY --from=cacher /app/target target
COPY --from=cacher /usr/local/cargo /usr/local/cargo
RUN cargo build --release
# Final stage
FROM gcr.io/distroless/cc-debian11
COPY --from=builder /app/target/release/melt-agent-host /app/melt-agent-host
WORKDIR /app
但是,我也想抨击这张图片。
是否有办法在这个分布式映像中安装bash ?
我还尝试了一些提供bash功能的最后阶段的其他基本映像,例如alpine, busybox -但是这些图像,我面临着关于libgcc.so missing
的其他一些错误
总而言之,我需要一个小尺寸的基本映像用于最后一个阶段,它与Rust二进制文件兼容,还允许bash功能。
您的最终图像正在从一个"发行版";基地的形象。它不包括任何用户空间工具——甚至可能没有/bin/sh
二进制文件——这没关系。你将不能docker exec
到这个图像,这可能不是一个问题。
您的映像只包含一组共享库,/etc
中的一些控制文件和一个编译的二进制文件(考虑将其复制到/usr/bin
或/usr/local/bin
中,以便更容易运行)。在这种情况下,我不清楚你会用docker exec
shell做什么。
如果出于某种原因,你确实需要一个shell和通常与之配套的各种工具(ls
,grep
,等),你需要某种"正常的";基础图像,不是"无失真"图像;或特殊的scratch
镜像。如果你已经建立了一个静态二进制文件,那么busybox
图像可能会工作;如果你有一个动态二进制文件,alpine
也可以工作(它将在/bin/sh
上有一个POSIX shell,但不是GNU bash),但你可能需要构建你的最终镜像阶段FROM debian
或FROM ubuntu
。
... all of your build stages ...
FROM debian:bullseye
COPY --from=builder /app/target/release/melt-agent-host /usr/local/bin
CMD ["melt-agent-host"]
我猜你可以在你的docker文件中有一个docker命令复制/bin/bash到某个地方,然后执行它。我不知道bash是否依赖于您缺少的任何共享库,但这将是一个起点。如果还需要共享库,您也必须复制它们。
我还会建议,无论你认为你通过无失真图像获得了什么,你都没有真正获得。找一个极简的发行版…而且docker中的大多数都是这样。