我使用官方ubuntu:20.04
docker 镜像作为基础镜像,为我的应用程序创建了 docker 镜像。它占用了 300 MB。我开始探索是否可以进一步减小镜像大小,然后偶然发现了 canonical 的 chiesel。以下是一些有关 chiesel 的教程/链接。1,2,3,4。5,6因此,我开始使用 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-get
add-apt-repository
chmod
cd
bash
? 此外,对于我的应用程序,我正在克隆各种第三方库,然后运行它们的文件。这些文件本身可能需要其他 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