DockerFile是一个文本格式的配置文件,可以使用DockerFile快速的创建Docker镜像。
1.DockerFile基本组成
通常DockerFile的主要内容由四部分组成:基础镜像,维护者,镜像操作指令及容器启动执行指令,DockerFile由多行命令组成,且支持在每行开头使用#开头的注释行。
# This is a sample
# Base image to use, this must be set as the first line
FROM ubuntu:xeniel
# Maintainer info
LABEL maintainer docker_user<docker_user@email.com>
# Command to update the image
RUN echo "deb http://archive.ubuntu.com/ubuntu/ xeniel main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# Command when creating a new container
CMD /usr/sbin/nginx
通过在首行使用FROM指令可以指定基础镜像,使用LABEL指令描述维护者的信息。接下来是镜像的操作指令,使用RUN指令指定将对镜像执行跟随的命令,同时每运行一条RUN指令,镜像就会被封装一次,添加新的一层并提交。最后使用CMD指令指定容器创建时的操作命令。
2.DockerFile指令说明
DockerFile指令分为配置指令和操作指令,配置指令用于配置镜像信息,操作指令是具体执行的操作。
指令一般格式:INSTRUCTION arguments
2.1 配置指令
| 指令 | 说明 |
|---|---|
| ARG | 定义创建镜像过程中使用的变量 |
| FROM | 指定基础镜像 |
| LABEL | 添加元数据标签信息 |
| EXPOSE | 声明镜像内服务监听端口 |
| ENV | 指定环境变量 |
| ENTRYPOINT | 指定镜像的默认入口命令 |
| VOLUME | 创建一个数据卷挂载点 |
| USER | 指定运行容器时的用户名或UID |
| WORKDIR | 配置工作目录 |
| ONBUILD | 创建子镜像时指定自动执行的操作指令 |
| STOPSIGNAL | 指定退出的信号值 |
| HEALTHCHECK | 配置容器如何健康检查 |
| SHELL | 指定默认shell类型 |
-
ARG
定义创建镜像过程中使用的变量,当镜像编译成功后,ARG指定的变量将销毁
格式:ARG [=]
ARG VERSION=9.3 FROM debian:${VERSION} -
FROM
指定基础镜像
格式:FROM
[: [AS ]]
FROM debian:9.3 -
LABEL
为生成的镜像添加元数据标签信息
格式:LABEL = =
LABEL version="0.0.1-beta" LABEL author="jeff" date="2020-11-18" -
EXPOSE
声明镜像内服务监听端口
格式:EXPOSE
EXPOSE 22 -
ENV
指定环境变量,在镜像生成过程中会被后续RUN指令使用,且在容器中也会存在
格式:ENV =
ENV APP_VERSION=0.1.1-beta ENV APP_HOME=/usr/local/app -
ENTRYPOINT
指定镜像的默认入口命令,会在容器启动时作为跟命令执行,所有传入值都将作为该命令的参数。使用该指令时,CMD指令指定值将作为根命令的参数。每个DockerFile只会有一个ENTRYPOINT指令生效,当指定多个时只有最后一个生效。在容器启动时,可以使用
--entrypoint参数覆盖格式:ENTRYPOINT ["executable", "param1", "param2"]或ENTRYPOINT command param1 param2
-
VOLUME
创建一个数据卷挂载点
格式:VOLUME ["/data"]
-
USER
指定运行容器时的用户名或UID,后续的RUN指令也会使用指定的用户身份
格式:USER
-
WORKDIR
为后续RUN, CMD, ENTRYPOINT指令配置工作目录。为避免出错,推荐使用绝对路径
格式:WORKDIR
WORKDIR /a WORKDIR b WORKDIR c RUN pwd # path: /a/b/c -
ONBUILD
指定当基于已生成的父镜像创建子镜像时自动执行的操作指令,即在子镜像的DockerFile中执行相应的指令
格式:ONBUILD [INSTRUCTION]
ONBUILD ADD . /app/src ONBUILD RUN apt-get update && apt-get install -y nginx -
STOPSIGNAL
指定创建的容器接受退出的信号值
格式:STOPSIGNAL
-
HEALTHCHECK
配置容器如何健康检查,自Docker 1.12开始支持
格式::
HEALTHCHECK [OPTIONS] CMD 根据执行命令返回值是否为0判断
HEALTHCHECK NONE 禁用健康检查
OPTIONS支持的参数:
-interval=DURATION 健康检查时间间隔,默认30s
-timeout=DURATION 健康检查等待结果的超时,默认30s
-retries=N 失败重试次数,默认3次
-
SHELL
指定默认shell类型
格式:SHELL ["executable", parameters]
默认:["/bin/sh", "-c"]
2.2 操作指令
| 指令 | 说明 |
|---|---|
| RUN | 对镜像运行跟随命令 |
| CMD | 容器启动时默认执行的命令 |
| ADD | 添加内容到镜像 |
| COPY | 复制内容到镜像 |
-
RUN
对镜像运行跟随命令,命令较长时可以使用
\换行格式:RUN 或 RUN ["executable", "param1", "param2"]
RUN apt-get update \ && apt-get install -y nginx -
CMD
容器启动时默认执行的命令,每个DockerFile只会执行一条CMD指令,若指定了多条,则只有最后一条被执行
格式:
CMD ["executable", "param1", "param2"] 推荐
CMD command param1 param2 在默认shell中执行
CMD ["param1", "param2"] 给ENTRYPOINT提供默认参数
-
ADD
添加内容到镜像
格式:ADD
src可以是DockerFIle所在目录的相对路径,也可以是URL还可以是一个tar文件(会自动解压为目录),dest可以是镜像内绝对路径或相对WORKDIR的相对路径
-
COPY
复制内容到镜像,功能同ADD指令,当使用本地目录为源目录时推荐使用COPY指令
格式:COPY
3.镜像创建
完成DockerFile编写之后,可以通过使用docker build命令来创建镜像
docker build [OPTIONS]
OPTIONS选项:
-t 可重复使用为镜像添加标签
:上下文路径,打包该路径下的所有内容并上传供Docker引擎构建镜像使用