Dockerfile制作原则

Dockerfile是Docker用来构建镜像的文本文件,包含自定义的指令和格式, 可以通过docker build命令从Dockerfile中构建镜像。

与容器与Dockerfile制作相关的规则如下:

  • 基础镜像尽量首先官镜像中的镜像, FROM指令应该包含参数tag;

  • 编写指令时允分利用一指令生成镜像层的原理,尽量安排相同的,不变的部份放在前面;

  • ADD和COPY指令很相近,但推荐用COPY, ADD可以下载URL和自动下载文件解压并保留原文件,ADD指令用RUN wget或RUN curl代替;

  • RUN指令不要在一行中单独使用 RUN apt-get update,应该避免使用它,要用也必须把RUN apt-get update && RUN apt-get install写在同一行;

  • 不要在Dockerfile中做端口映射;

  • 由于容器名称唯一,如果容器要扩容,运行容器时就不能指字容器名称;

  • 一容器一进程;

  • 入口运行程序必须SUSPEND;

  • 对外部依赖的变量不能写死在Dockerfile里,必须通过变量在运行期间注入,如连接库连接配置;

  • 日志目录通过volume挂载

  • 配置参数通过环境变量注入;

  • 带ONBUILD指令的必须带特殊标签;

  • Dockerfile有任何修改,必须修改tag;

注意:

  1. RUN指令exec格式中的参数会当成JSON数据被Docker解析,帮必须使用双引号而不能使用单引号。
  2. RUN指令在构建镜像时执行指令,并生成新的镜像;CMD指令在构建镜像时并不执行任何命令,而是在容器启动时默认将CMD指令作为第一条执行的命令;
  3. ONBUILD指令必须有特殊的标签:

    1. 在构建过程中,ONBUILD指令会添加到触发器指令镜像元数据库,这些触发指令不会在当前构建过程中执行;
    2. 在构建过程最后,触发器指令会被存储在镜像详情中,其主键是OnBuild,可以使用docker inspect命令查看;
    3. 之后该镜像可能作为其他Dockerfile中的FROM指令的参数。在构建过程中,FROM指令会寻找ONBUILD触发器指令,并且会以它们注册的顺序执行。若有触发器指令执行失败,则FROM指令被中止,并返回失败;若所有触发器指令执行成功,则FROM指令完成并继续执行下面的执行。在镜像构建完成之后,触发器指令会被清除,不会被子镜像继承。

      使用包含ONBUILD指令的Dockerfile构建的镜像应该有特殊的标签,如easynode:2.0-onbuild.