Dockerfile 实战经验-容器体积最小化

1 基础镜像要选好
    FROM scratch 空镜像,不支持操作系统常用命令,如果希望制作出来的基础镜像足够小,可以基于它按需安装软件包.
    基于这个思想,Docker官方为我们准备了一个可以直接拿来使用的镜像源  debian:stretch-slim,分析其dockerfile 
    FROM scratch
    ADD rootfs.tar.xz /
    CMD ["bash"]
                    
主要就是在空镜像的基础上安装了一些操作系统常用命令软件,其中rootfs.tar.xz很精炼,软件清单可见:    https://raw.githubusercontent.com/debuerreotype/docker-debian-artifacts/42bec5bc2f5a76ceeb125bc4e66d6f70a95e933f/stretch/slim/rootfs.manifest
所以可以直接使用
FROM debian:stretch-slim  来直接获取体积小且包含最基础的命令集支持的基础镜像 

FROM scratch:stretch  官方预先配置好的容器镜像,体积会比debian:stretch-slim 大。
    
 
2  尽可能减少软件包体积
2-1 
# -y:yes,在命令行交互提示中,直接输入 yes
# –no-install-recommends参数来避免安装非必须的文件,从而减小镜像的体积
apt-get install -y --no-install-recommends 

2-2 如果因为编译源码需要,必须安装一些编译工具链,在编译工作完成后要及时清理软件安装包,依赖包以及相关配置文件
# 删除软件及其配置文件
apt-get --purge remove <package>
# 删除没用的依赖包
apt-get autoremove <package>
# 此时dpkg的列表中有“rc”状态的软件包,其中 rc 状态的包即卸载了包却保留了配置文件,可以执行如下命令做最后清理:
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P

3 注意安全防护 
3-1 如果将本地源码COPY到容器内部进行源码编译,需要在编译完成时及时清理源码文件 

4 注意CMD和ENTRYPOINT的使用  
CMD指令为ENTRYPOINT指令提供默认参数是基于镜像层次结构生效的,而不是基于是否在同个Dockerfile文件中。意思就是说,如果Dockerfile指定基础镜像中是ENTRYPOINT指定的启动命令,则该Dockerfile中的CMD依然是为基础镜像中的ENTRYPOINT设置默认参数。
http://www.cnblogs.com/lienhua34/p/5170335.html

所以,当我们制作基础镜像的时候,一定要注意ENTRYPOINT 的使用,制作基础镜像大多会选择以CMD为结尾甚至连CMD都没有。

5 及时清理无用的文件,减少对容器磁盘空间的占用。

6 COPY的使用 
6-1 
从镜像层次结构角度考虑,COPY时,把那些最不容易发生变化的文件的拷贝操作放在较低的镜像层中,这样在重新 build 镜像时就会使用前面 build 产生的缓存,以此来加速镜像的 build 过程。同时也要注意,COPY操作能合并的尽量合并,减少缓存操作。
6-2 
COPY 命令还支持 Go 风格的通配符
COPY check* /testdir/           # 拷贝所有 check 开头的文件
COPY check?.log /testdir/       # ? 是单个字符的占位符,比如匹配文件 check1.log
6-3
对于目录而言,COPY 和 ADD 命令具有相同的特点:只复制目录中的内容而不包含目录自身。
如果想连带目录一起复制,需要在目标路径中指定这个目录的名称。

7 保证基础镜像的通用性,有针对性的配置或则脚本文件不需要再容器制作是拷贝进去,这样会增加基础容器的体积以及破坏基础镜像的通用性,可以将
  此类任务留在部署阶段完成,如在docker-compose 使用磁盘卷挂载。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章