如何使用 JIB 删除容器内的目录?
How do I remove a directory inside container with JIB?
如果是docker文件,我想通过执行以下命令删除目录
RUN rm /usr/bin/wget
我该怎么做?任何帮助表示赞赏
首先要强调的是:在Dockerfile
、RUN 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放的文件是没有理由删除的。
如果是docker文件,我想通过执行以下命令删除目录
RUN rm /usr/bin/wget
我该怎么做?任何帮助表示赞赏
首先要强调的是:在Dockerfile
、RUN 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放的文件是没有理由删除的。