我们经常会将一些二进制或者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)。如下图所示
如果我们修改了某个文件,其实并没有修改原文件,而是将文件拷贝到上层,然后在本层修改。在读文件的时候,优先读取上层文件,从而给用户感觉文件被修改了。详细原理可以参见之前关于容器内核原理的文章。
所以这行 ”chmod -R +x /opt“,虽然只是修改了文件的执行权限,但也需要拷贝/opt下的文件到上层进行修改,导致镜像的增加了几百M空间。为了避免这个问题,解决办法通常有两种,一种是先将本地目录修改权限以后,再通关过Dockerfile拷贝到镜像里面,另一种是buildkit构建已经支持chmod了,在COPY/ADD的时候添加”--chmod“也可以修改文件的权限。
页面更新:2024-02-27
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号