zoukankan      html  css  js  c++  java
  • Dockerfile最佳实践(一)

    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的表现会更好.

  • 相关阅读:
    JavaScript 闭包究竟是什么
    Javascript闭包简单理解
    使用border做三角形
    负边距在布局中的使用
    direction和unicode
    CSS 实现打字效果
    你可能没注意的CSS单位
    前端模块化
    JavaScript面向对象
    阿里前端两年随想
  • 原文地址:https://www.cnblogs.com/ilinuxer/p/6613837.html
Copyright © 2011-2022 走看看