DOCKER学习_012:Dockerfile配置指令详解

Posted zyxnhr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DOCKER学习_012:Dockerfile配置指令详解相关的知识,希望对你有一定的参考价值。

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、CMDENTRYPOINT指令配置工作目录
可以使用多个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/)本人同意即可转载,谢谢!

以上是关于DOCKER学习_012:Dockerfile配置指令详解的主要内容,如果未能解决你的问题,请参考以下文章

DOCKER学习_017:Docker-Compose介绍

002Docker学习__对docker架构的理解

003Docker学习__commit命令构建docker镜像

Docker学习重点~docker安装配置阿里云镜像加速

Docker学习之路

WDK学习笔记_docker容器客户端_fabric-go-sdk