1 Dockerfile结构
基础镜像信息
镜像操作指令
容器启动时执行指令
2 FROM
指定基础镜像,用于继承其他镜像使用的
FROM ubuntu:14.06 FROM centos FROM nginx:latest
3 LABEL
镜像创建者的基本信息
4 ENV
定义Docker容器内的环境变量
- ENV # 只能设置一个变量
- ENV = … # 允许一次设置多个变量
ENV <key> <value> 指定一个环境变量,会被后续RUN指令使用,并在容器运行时保持 示例: ENV TZ "Asia/Shanghai"
5 ADD
将复制指定的 到容器中的,源必须是相对于Dockerfile的相对路径
ADD <src> <dest> 复制指定的<src>到容器中的<dest> <src>可以是dockerfile所在目录的一个相对路径,也可以是一个url,或者tar文件(会自动解压缩) 示例: ADD aliyun-mirror.repo /etc/yum.repos.d/CentOS-Base.repo
6 COPY
将复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的
COPY <src> <dest> 与ADD类似 目录路径不存在时,会自动创建 示例: COPY aliyun-mirror.repo /etc/yum.repos.d/CentOS-Base.repo
ADD和COPY的区别
ADD与COPY是完全不同的命令。COPY是这两个中最简单的,它只是从主机复制一份文件或者目录到镜像里。ADD同样可以这么做,但是它还有更神奇的功能,像解压TAR文件或从远程URLs获取文件。为了降低Dockerfile的复杂度以及防止意外的操作,最好用COPY来复制文件。Best Practices for Writing Dockerfiles建议尽量使用COPY,并使用RUN与COPY的组合来代替ADD,这是因为虽然COPY只支持本地文件拷贝到container,但它的处理比ADD更加透明,建议只在复制tar文件时使用ADD,如ADD trusty-core-amd64.tar.gz /。
7 WORKDIR
进入容器的默认路径,相当于cd,后续的RUN、CMD、ENTRYPOINT也会使用指定路径。
WORKDIR </path/to/workdir> 为后续的RUN、CMD\ENTRYPOINT指令配置工作目录 可以使用多个WORKDIR,后续命令如果参数是相对路径,则会基于之前命令指定的路径 示例: WORKDIR /a WORKDIR b WORKDIR c
8 USER
指定运行容器时的用户名或UID,后续的RUN、CMD、ENTRYPOINT也会使用指定用户
当服务不需要管理员权限时,可以通过该命令指定运行用户
USER <username> 示例: USRE www
9 RUN
RUN用来执行命令行命令的,只是在构建镜像build的时候执行
RUN <command> 或者 RUN ["executable","param1","param2"] 前者将在shell命令终端中执行,即/bin/sh -c ;后者使用exec执行 每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像 当命令较长时,可使用/换行 示例: RUN ["/bin/bash","-c","echo hello"] RUN apt install -y openssh-server
10 VOLUME
创建一个挂载点,类似于容器启动时使用的-v选项,只不过这里不能指定挂载到宿主机的位置
默认为/var/lib/docker/${文件系统名称}目录下
一般用来存放数据库和需要保持的数据
VOLUME <path> 示例: VOLUME ["data"]
11 EXPOSE
告诉docker容器需要暴露的端口
在启动容器时需要通过-P,docker主机会自动分配一个端口转发到指定的端口
使用-p,则可以具体指定哪个本地端口映射过来
EXPOSE <port> [<port>...] 示例: EXPOSE 22 80
12 HEALTHCHECK
用于检测容器指定的进程是否存活
避免进程僵死导致容器未异常退出引起的故障
HEALTHCHECK [args] CMD <指令> 示例: FROM nginx RUN apt-get update && apt-get install -y curl && rm -rf /var/lib /apt/lists/* HEALTHCHECK --interval=5s --retries=3 --timeout=3s CMD curl -fs http://localhost/ || exit 1
13 CMD
指定启动容器时执行的命令
每个Dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会被执行
如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令
语法: CMD ["executable","param1","param2"] #使用exec执行,推荐的方式 CMD command param1 param2 #在/bin/sh中执行,提供给需要交互的应用 CMD ["param1","param2"] #提供给ENTRYPOINT的默认参数 示例: CMD ["supervisord","-c","/etc/supervisord.conf"]
14 ENTRYPOINT
配置容器启动后执行的命令
不会被docker run 提供的参数覆盖
每个Dockerfile只能有一个ENTRYPOINT,如果指定了多个,只有最后一个被执行
语法: ENTRYPOINT ["executable","param1","param2"] ENTRYPOINT command param1 param2 示例: ENTRYPOINT ["/build.sh"]
15 ONBUILD
配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令
语法: ONBUILD [INSTRUTION] 示例: 创建镜像A: ONBUILD ADD . /app/src ONBUILD RUN /usr/local/bin/pypthon-build --dir /app/src 如果基于镜像A创建新的镜像时,新的Dockerfile使用FROM A指定基础镜像时,会自动执行ONBUILD指令内容,等价于在后面添加了两条指令: FROM A ADD . /app/src RUN /usr/local/bin/python-build --dir /app/src 使用ONBUILD指令的镜像,推荐在标签中注明,如:ruby:1.9-onbuild
16 编写Dockerfile的原则,最佳实践
尽可能让变更少的镜像层优先构建
二次构建时,利用镜像的缓存特性提升构建效率
尽可能少的使用指令关键字
每使用一次指令关键字,就会创建一个新的只读层
尽可能清理不必要的文件
使构建后的镜像尽可能的小
博主声明:本文的内容来源主要来自誉天教育晏威老师,由本人实验完成操作验证,需要的博友请联系誉天教育(http://www.yutianedu.com/),获得官方同意或者晏老师(https://www.cnblogs.com/breezey/)本人同意即可转载,谢谢!
原文地址:https://www.cnblogs.com/zyxnhr/p/12147137.html