如何使用 JIB 删除容器内的目录?

How do I remove a directory inside container with JIB?

如果是docker文件,我想通过执行以下命令删除目录

RUN rm /usr/bin/wget

我该怎么做?任何帮助表示赞赏

首先要强调的是:在DockerfileRUN rm /usr/bin/wget不会物理删除文件。前一层中的文件和目录将永远保留在那里。因此,如果您尝试使用 rm 删除包含敏感信息的文件,它是行不通的。例如,最近,这种疏忽导致了 Codecov 中的高调 security breach

Docker Layer Attacks: Publicly distributed Docker images should be either squashed or multistage such that intermediate layers that contain sensitive information are excluded from the final build.

发生的事情是,RUN rm /usr/bin/wget 创建了另一个包含“whiteout”文件的层 /usr/bin/.wh.wget,并且这个新层位于所有先前层之上。然后在运行时,只是容器运行时会隐藏文件,你不会看到它。但是,如果您下载图像并检查每一层,您将能够看到并提取 /usr/bin/wget/usr/bin/.wh.wget 文件。所以,是的,稍后执行 rm 根本不会减小图像的大小。 (顺便说一句,Dockerfile 中的每个 RUN 都会在末尾创建一个新层。因此,例如,如果您像 RUN touch /foo && rm /foo 一样删除同一 RUN 中的文件,您将不会在最终图像中保留 /foo。)

因此,对于 Jib,如果您要“删除”的文件或目录来自基础映像,您可以为它创建一个新的 whiteout 文件。 Jib 具有 <extraDirectories> feature 功能,可以将任意文件复制到图像中。因此,例如,由于 <project root>/src/main/jib 是默认的额外目录,您可以创建一个空的 src/main/jib/usr/bin/.wh.wget,它将被复制到图像中的 /usr/bin/.wh.wget

当然,如果您真的想物理删除来自基础映像的文件,唯一的选择是重建您的基础映像,使其不包含 /usr/bin/wget.

为了完整起见:如果您要删除的文件或目录不是来自您的基本映像而是来自 Jib,您可以使用 Jib Layer-Filter 扩展 (Maven/Gradle)。 (这是应用层过滤,不涉及whiteout文件。)但是,一般情况下Jib放的文件是没有理由删除的。