1.使用缓存

 Dockerfile的每条指令都会将结果提交为新的镜像,下一跳指令将会基于上一步指令的镜像的基础上构建,如果一个镜像存在相同的父镜像和指令(除了ADD),Docker将会使用镜像而不是执行该指令,即缓存.

为了有效的利用缓存,你需要保持你的Dockerfile一致,并且尽量在末尾修改.Dockerfile的前五行其实可以固定写成如下这样:

FROM ubuntu
MAINTAINER hhh
RUN echo ”deb http://archive.ubuntu.com/ubuntu precise main ubiverse” > etc/apt/sources.list
RUN apt-get update
RUN 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 mapping
EXPOSE 80:8080
#private only
EXPOSE 80

如果镜像的使用者关心容器公有映射了哪个公有端口,他们可以在运行镜像时通过-p参数设置,否则,docker会自动为容器分配端口.

切勿在Dockerfile映射公有端口.

4.CMD与ENTRYPOINT的语法.

CMD和ENTRYPOINT指令都非常简单,但他们都有一个隐藏的容易出错的功能,如果你不知道的话可能会在这里入坑,这些指令支持两种不同的语法:

CMD /bin/echo
#or
CMD [“/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最佳实践(一)的更多相关文章

  1. 【原创】Docker实战 Dockerfile最佳实践&&容器之间通信

    官方最佳实践文档 https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#from Docker实战(三十) ...

  2. dockerfile 最佳实践及示例

    Dockerfile 最佳实践已经出现在官方文档中,地址在 Best practices for writing Dockerfiles.如果再写一份最佳实践,倒有点关公门前耍大刀之意.因此本篇文章是 ...

  3. 《容器高手实战: Dockerfile最佳实践》

    Dockerfile最佳实践一个容器对应一个进程一个Docker容器应该只对应一个进程,也就是一个Docker 镜像一般只包含一个应用的制品包(比如.jar). 在需要组合多个进程的场景,使用容器组( ...

  4. Dockerfile 最佳实践

    之前 一篇文章介绍 docker 的镜像基本原理和概念 ,主要介绍在编写 docker 镜像的时候一些需要注意的事项和推荐的做法. 虽然 Dockerfile 简化了镜像构建的过程,并且把这个过程可以 ...

  5. go项目dockerfile最佳实践

    1. 前言 2. 不需要cgo情况下的最佳实践 3. 依赖cgo情况下的最佳实践 1. 前言 这几天在构建golang编写的web项目中,关于dockerfile编写的一些总结 可能是单纯我比较菜(大 ...

  6. 编写 Dockerfile 最佳实践

    官方仓库虽然有数十万计的免费镜像,但大多数无法直接满足公司业务需求,这就需要我们自己去定制镜像了. Docker通过Dockerfile自动构建镜像,Dockerfile是一个包含用于组建镜像的文本文 ...

  7. 8、Dockerfile介绍和最佳实践

    一.Dockerfile 概念 1.Dockerfile是什么 Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序.库.资源.配置等文件外,还包含了一些为运行时准备的一些配置参数(如 ...

  8. Dockerfile 命令详解及最佳实践

    Dockerfile 命令详解 FROM 指定基础镜像(必选) 所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制.就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指 ...

  9. 8.云原生之Docker容器镜像构建最佳实践浅析

    转载自:https://www.bilibili.com/read/cv15220861/?from=readlist 本章目录 0x02 Docker 镜像构建最佳实践浅析 1.Dockerfile ...

随机推荐

  1. java编程思想---对象

    一.对象 对于每种语言来说,都有自己操纵内存中元素的方法. 在java中,一切被视为对象.可是操纵对象的是一个"引用".举个样例,能够比作为遥控器对电视的操作,遥控器就是引用,而电 ...

  2. 浅谈Java两种并发类型——计算密集型与IO密集型

    转载:https://blog.csdn.net/u013070853/article/details/49304099 核心是可以分别独立运行程序指令的计算单元.线程是操作系统能够进行运算调度的最小 ...

  3. #lspci | grep Eth

    该命令作用:将lspci的输出当做输入,从中找出包含Eth的行.在我的Fedora机器上运行结果为 [root@localhost etc]# lspci | grep Eth00:04.0 Ethe ...

  4. PHP导出word,CVS,PDF

    WORD: <?php header("Cache-Control: no-cache, must-revalidate"); header("Pragma: no ...

  5. 【CSWS2014 Summer School】深度问答技术及其在搜索中的应用-马艳军

    Title: 深度问答技术及其在搜索中的应用 马艳军博士, 百度 Abstract: 深度问答(DeepQA)是一种基于对自然语言深度理解的智能问答技术,其核心技术涉及知识图谱建设.语义表示和计算.语 ...

  6. Java中执行存储过程和函数(web基础学习笔记十四)

    一.概述 如果想要执行存储过程,我们应该使用 CallableStatement 接口. CallableStatement 接口继承自PreparedStatement 接口.所以CallableS ...

  7. selenium 加载jquery

    packagecom.example.tests; import staticorg.junit.Assert.*; importjava.util.*; importorg.junit.*; imp ...

  8. exception PLS-00215: String length constraints must be in range (1 .. 32767)

      exception PLS-00215: String length constraints must be in range (1 .. 32767) CreationTime--2018年8月 ...

  9. 实现锁死的有滚动条的div的表格(datagird)

    JS框架使用Jquery 最终效果: 代码结构: 代码: <HEAD><TITLE>new document</TITLE> <META name=Gener ...

  10. HTTP所承载的货物(图像、文本、软件等)要满足的条件

    HTTP所承载的货物(图像.文本.软件等)要满足的条件: •可以被正确识别 通过Content-Type 首部说明媒体格式,Content-Language 说明语言,以便浏览器和其他客户端能正确处理 ...