Dockerfile踩坑,一行命令增加几百兆空间

我们经常会将一些二进制或者Java构建的jar包、war包拷贝到镜像里面,就像下面Dockerfile一样安装一个JDK,将jdk拷贝到/opt目录下,然后设置JAVA_HOME。

FROM centos
ENV LANG en_US.UTF-8
ENV TZ Asia/Shanghai

COPY softs/jdk1.8.0_161 /opt/

RUN set -ex && 
rm /bin/sh && 
ln -sv /bin/bash /bin/sh && 
chmod -R +x /opt

ENV JAVA_HOME /opt/jdk1.8.0_161
ENV CLASSPATH .:$JAVA_HOME/lib/tools.jar:/lib.dt.jar
ENV PATH $JAVA_HOME/bin:$PATH

但奇怪的是:基础镜像200M + JDK 100M。但总的镜像大小却是400+M,这是为啥呢?

其实这里有个小坑需要注意,就是Dockerfile的分层设计,我们都知道Dockerfile中每行语句都会生成一个新的Dockerfile分层,上一层变为只读(read only)。如下图所示

Dockerfile踩坑,一行命令增加几百兆空间

如果我们修改了某个文件,其实并没有修改原文件,而是将文件拷贝到上层,然后在本层修改。在读文件的时候,优先读取上层文件,从而给用户感觉文件被修改了。详细原理可以参见之前关于容器内核原理的文章。

所以这行 ”chmod -R +x /opt“,虽然只是修改了文件的执行权限,但也需要拷贝/opt下的文件到上层进行修改,导致镜像的增加了几百M空间。为了避免这个问题,解决办法通常有两种,一种是先将本地目录修改权限以后,再通关过Dockerfile拷贝到镜像里面,另一种是buildkit构建已经支持chmod了,在COPY/ADD的时候添加”--chmod“也可以修改文件的权限。

展开阅读全文

页面更新:2024-02-27

标签:都会   内核   语句   容器   原文件   奇怪   命令   权限   原理   大小   感觉   文件   基础   目录   用户   详细   科技   空间

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top