如何在构建 distroless ubuntu 镜像时获取所需的 ubuntu 命令

如何在构建 distroless ubuntu 镜像时获取所需的 ubuntu 命令

我使用官方ubuntu:20.04docker 镜像作为基础镜像,为我的应用程序创建了 docker 镜像。它占用了 300 MB。我开始探索是否可以进一步减小镜像大小,然后偶然发现了 canonical 的 chiesel。以下是一些有关 chiesel 的教程/链接。123456因此,我开始使用 chisel 为我的应用程序准备 distroless ubuntu 20.04 映像。

我尝试了以下dockerfile:

ARG UBUNTU_RELEASE=20.04 CHISEL_VERSION=v0.9.0

FROM ubuntu:$UBUNTU_RELEASE AS chisel_ubuntu_builder

ARG TARGETARCH UBUNTU_RELEASE CHISEL_VERSION

RUN apt-get update \
    && DEBIAN_FRONTEND=noninteractive apt-get install -y ca-certificates git \
    && apt-get clean -y \
    && rm -rf /var/lib/apt/lists/*

ADD "https://github.com/canonical/chisel/releases/download/${CHISEL_VERSION}/chisel_${CHISEL_VERSION}_linux_${TARGETARCH}.tar.gz" chisel.tar.gz
RUN tar -xvf chisel.tar.gz -C /usr/bin/

RUN mkdir /rootfs

RUN chisel cut --release "${UBUNTU_RELEASE}" --root /rootfs base-files_base

FROM scratch
COPY --from=chisel_ubuntu_builder /rootfs /

我能够构建上述图像。但它包含空文件系统。我意识到我至少需要 bash。但后来我发现没有针对 ubuntu 20.04 的 bash 的凿子切片,可以检查这里。有一个适用于 ubuntu 22.04 的,可以检查一下这里

因此我尝试从其他 ubuntu 库中获取源 bash,如下所示:

ARG UBUNTU_RELEASE=20.04 CHISEL_VERSION=v0.9.0

FROM ubuntu:$UBUNTU_RELEASE AS chisel_ubuntu_builder
# ... same as earlier dockerfile ...

FROM scratch
COPY --from=chisel_ubuntu_builder /rootfs /
# copy bash from bash_source
COPY --from=chisel_ubuntu_builder /rootfs /
COPY --from=chisel_ubuntu_builder /bin/bash /bin/bash
COPY --from=chisel_ubuntu_builder /bin/apt /bin/apt
COPY --from=chisel_ubuntu_builder /bin/apt-get /bin/apt-get
COPY --from=chisel_ubuntu_builder /usr/bin/bash /usr/bin/bash
COPY --from=chisel_ubuntu_builder /usr/bin/apt /usr/bin/apt
COPY --from=chisel_ubuntu_builder /usr/bin/apt-get /usr/bin/apt-get

我能够构建此图像。但是,在使用上述图像作为基础图像构建应用程序图像时,我收到以下错误:

#5 [baseenv 2/4] RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then     add-apt-repository -y "deb  xenial-security main"; fi
#0 0.031 /bin/bash: if [ "$TARGETPLATFORM" = "linux/amd64" ]; then     add-apt-repository -y "deb  xenial-security main"; fi: No such file or directory
#5 ERROR: process "/bin/bash if [ \"$TARGETPLATFORM\" = \"linux/amd64\" ]; then     add-apt-repository -y \"deb  xenial-security main\"; fi" did not complete successfully: exit code: 127http://security.ubuntu.com/ubuntuhttp://security.ubuntu.com/ubuntuhttp://security.ubuntu.com/ubuntu

我猜,它现在包含bash但现在不包含add-apt-repository。我是否也需要将此库复制到我的基础映像?然后我快速浏览了基于映像的应用程序 dockerfile 。ubuntu:20.04它包含各种其他命令,例如apt,,,,。我是否必须像从其他基础映像复制一样单独复制它们apt-getadd-apt-repositorychmodcdbash? 此外,对于我的应用程序,我正在克隆各种第三方库,然后运行它们的文件。这些文件本身可能需要其他 ubuntu 命令。

问 1.我是否必须从其他基础图像复制所有这些必需的命令?

这会很乏味,因为我会在镜像构建失败时知道我需要什么。然后将COPY命令添加到dockerfile并重建镜像。所以我想知道为我的应用程序构建distroless镜像的推荐程序。

问2.另外,在构建 distroless 镜像时使用安装库是否可以apt-get install,或者它基本上使它不那么 distroless?如果我不应该使用它apt-get来构建 distroless 镜像,那么我应该如何安装所有必要的依赖包?

附言:第二张图片也不包含 bash。运行时出现以下错误:

$ docker run -it myimage /bin/bash
exec /bin/bash: no such file or directory

相同/usr/bin/bash

$ docker run -it myimage /usr/bin/bash
exec /bin/bash: no such file or directory

相关内容