使用Dockerfile创建镜像
一、概括
Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。
一般而言,Dockerfile分为四部分:
- 基础镜像信息、
- 维护者信息、
- 镜像操作指令
- 容器启动时执行指令
1 | This Dockerfile uses the ubuntu image |
其中,一开始必须指明所基于的镜像名称,
接下来一般是说明维护者信息。
后面则是镜像操作指令,例如RUN指令,RUN指令将对镜像执行跟随的命令。每运行一条RUN指令,镜像就添加新的一层,并提交。
最后是CMD指令,用来指定运行容器时的操作命令
二、 dockerfile 指令说明


2.1 FROM
格式为
1 | FROM<image> |
任何Dockerfile中的第一条指令必须为FROM指令。并且,如果在同一个Dockerfile中创建多个镜像,可以使用多个FROM指令(每个镜像一次)。
2.2 MAINTAINER
指定维护者信息,格式为MAINTAINER
1 | MAINTAINER image_creator@docker.com |
该信息会写入生成镜像的Author属性域中。
2.3 RUN
运行指定指令
格式为
1 | RUN<command> |
注意,后一个指令会被解析为Json数组,因此必须用双引号。
每条RUN指令将在当前镜像的基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用\来换行。例如
1 | RUN apt-get update \ |
减少镜像层数:如果希望所生成镜像的层数尽量少,则要尽量合并指令,例如多个RUN指令可以合并为一条;
2.4 CMD
CMD指令用来指定启动容器时默认执行的命令.
1 | 使用exec执行,是推荐使用的方式; |
每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。
2.5 LABEL
LABEL指令用来指定生成镜像的元数据标签信息。
格式为LABEL
例如:
1 | LABEL version="1.0" |
2.6 EXPOSE
声明镜像内服务所监听的端口。
格式为EXPOSE
例如:
1 | EXPOSE 22 80 8443 |
注意,该指令只是起到声明作用,并不会自动完成端口映射。
2.7 ENV
指定环境变量,在镜像生成过程中会被后续RUN指令使用,在镜像启动的容器中也会存在。
格式为ENV
1 | ENV PG_MAJOR 9.3 |
指令指定的环境变量在运行时可以被覆盖掉
2.8 ADD
该命令将复制指定的
格式为ADD
其中
2.9 COPY
复制本地主机的
路径同样支持正则格式。
当使用本地目录为源目录时,推荐使用COPY。
2.10 ENTRYPOINT
镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所有传入值作为该命令的参数。
1 | exec调用执行 |
每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个有效。
2.11 VOLUME
创建一个数据卷挂载点。
格式为VOLUME[“/data”]。
可以从本地主机或其他容器挂载数据卷,一般用来存放数据库和需要保存的数据等。
2.12 USER
指定运行容器时的用户名或UID,后续的RUN等指令也会使用指定的用户身份。
格式为USER daemon。
2.13 WORKDIR
为后续的RUN、CMD和ENTRYPOINT指令配置工作目录。
格式为WORKDIR/path/to/workdir。
可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如:
1 | WORKDIR /a |
则最终路径为/a/b/c。
2.15 ONBUILD
配置当所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令。
格式为
1 | ONBUILD[INSTRUCTION] |
例如,Dockerfile使用如下的内容创建了镜像image-A:
1 | [...] |
如果基于image-A创建新的镜像时,新的Dockerfile中使用FROM image-A指定基础镜像,会自动执行ONBUILD指令的内容,等价于在后面添加了两条指令:
1 | FROM image-A |
2.16 STOPSIGNAL
指定所创建镜像启动的容器接收退出的信号值。例如:
1 | STOPSIGNAL signal |
2.17 HEALTHCHECK
配置所启动容器如何进行健康检查(如何判断健康与否),自Docker 1.12开始支持。
格式有两种:
1 | ·HEALTHCHECK[OPTIONS]CMD command:根据所执行命令返回值是否为0来判断; |
OPTION支持:
- ·–interval=DURATION(默认为:30s):过多久检查一次;
- ·–timeout=DURATION(默认为:30s):每次检查等待结果的超时;
- ·–retries=N(默认为:3):如果失败了,重试几次才最终确定失败。
2.18 SHELL
指定其他命令使用shell时的默认shell类型。
默认值为[“/bin/sh”,”-c”]。
注意: 对于Windows系统,建议在Dockerfile开头添加#escape=`来指定转义信息。
三、使用.dockerignore文件
可以通过.dockerignore文件(每一行添加一条匹配模式)来让Docker忽略匹配模式路径下的目录和文件。例如:
1 | comment |