Dockerfile最佳实践(一)
来源:互联网 发布:天津外国语大学 知乎 编辑:程序博客网 时间:2024/05/01 16:26
Dockerfile最佳实践(一)
本次内容时通过说一些建议和技巧来帮助你使用Dockerfile.
1.使用缓存
Dockerfile的每条指令都会将结果提交为新的镜像,下一跳指令将会基于上一步指令的镜像的基础上构建,如果一个镜像存在相同的父镜像和指令(除了ADD),DOcker将会使用镜像而不是执行该指令,即缓存.
为了有效的利用缓存,你需要保持你的Dockerfile一致,并且尽量在末尾修改.Dockerfile的前五行其实可以固定写成如下这样:
FROM ubuntuMAINTAINER shanyongxu <783284481@qq.com>RUN echo ”deb http://archive.ubuntu.com/ubuntu precise main ubiverse” > etc/apt/sources.listRUN apt-get updateRUN apt-get upgrade -y
更改MAINTAINER指令会使Docker强制执行RUN指令来更新apt,而不是还是用缓存.
所以,我们应该使用常用且不变的Dockerfile开始指令来利用缓存.
2.使用标签
除非你正在用Docker做实验,否则你应当通过-t选项来docker build新的镜像以便用于标记构建的镜像.一个简单的可读标签将帮助你管理每个创建的镜像.
docker build -t=”syx/df_test” .
注意,始终通过-t标记来构建镜像.
3.公开端口
两个Docker的核心概念是可重复和可移植.镜像应该可以运行在任何主机上并且运行尽可能多的次数.在Dockerfile中你有能力映射私有和共有端口,但是你永远不要通过Dockerfile映射公有端口.通过映射公有端口到主机上,你将只能运行一个容器化应用程序实例.
#private and public mappingEXPOSE 80:8080#private onlyEXPOSE 80
如果镜像的使用者关心容器公有映射了哪个公有端口,他们可以在运行镜像时通过-p参数设置,否则,docker会自动为容器分配端口.
切勿在Dockerfile映射公有端口.
4.CMD与ENTRYPOINT的语法.
CMD和ENTRYPOINT指令都非常简单,但他们都有一个隐藏的容易出错的功能,如果你不知道的话可能会在这里入坑,这些指令支持两种不同的语法:
CMD /bin/echo#orCMD [“/bin/echo”]
看起来没问题,但仔细一看其实两种方式的差距很大.如果你使用第二个语法:CMD(或ENTRYPOINT)是一个数组,它执行的命令完全像你期望的那样.如果使用第一种语法,Docker会在你的命令之前加上/bin/sh -c.
如果你不知道Docker修改了CMD命令,在命令前加上/bin/sh -c可能会导致一些意想不到的问题以及难以理解的功能.因此,在使用这两个指令时你应当使用数组语法,因为数组语法会确切的执行你打算执行的命令.
使用CMD和ENTRYPOINT时,请务必使用数组语法.
5.CMD和ENTRYPOINT结合使用更好
docker run命令中的参数都会传递给ENTRYPOINT指令,而不用担心它被覆盖(和CMD不同).当与CMD一起使用时ENTRYPOINT的表现会更好.
- Dockerfile最佳实践(一)
- Dockerfile 最佳实践
- Dockerfile最佳实践(二)
- Dockerfile 最佳实践
- Dockerfile 最佳实践
- Dockerfile 最佳实践
- 【转】Dockerfile 最佳实践
- Dockerfile 最佳实践
- Dockerfile最佳实践总结
- Docker学习笔记 — Dockerfile最佳实践
- Dockerfile实践
- Azure最佳实践(一)
- Hibernate最佳实践(一)
- Rails的最佳实践【一】
- CUDA最佳实践(一)
- Rails的最佳实践【一】
- React最佳实践(一)
- Dynatrace最佳实践(一)
- log4j系列一:log4j简介以及Loggers
- JAVA设计模式--抽象工厂模式
- 学习总结:Activity生命周期
- OSX PHP添加intl支持
- 解决虚拟机上的tomcat无法被主机访问的问题
- Dockerfile最佳实践(一)
- Python和shell中Base64编码使用那些事
- 工厂模式(三)--抽象工厂模式
- 纹理特征LBP(local binary pattern,局部二值模式)
- SSH框架从底层数据库到jsp页面响应流程及注意事项
- 一个简单的智能指针的实现
- 字符串函数
- 将url或者字符串转换成MD5格式(md5加密算法)的写法
- Swift 2.2 基础语法