Dockerfile书写规则

简介

Dockerfile相似于Makefile,包含有多条构建指令,Docker能够经过Dockerfile自动生成自定义镜像。docker

用法

docker build命令根据Dockerfile上下文构建镜像。构建的上下文是指定位置PATH或URL的文件集合。PATH是本地文件系统的一个文件夹。URL是一个Git仓库地址。shell

构建由Docker守护进程运行,而不是由CLI运行。构建过程所作的第一件事是将整个上下文递归地发送到守护进程。在大多数状况下,最好以空目录做为上下文,并将Dockerfile保存在该目录中,仅添加构建镜像所需的文件。网络

不要使用根目录,/做为构建的上下文PATH,这样会致使将磁盘上全部的内容发送到守护进程。curl

在Dockerfile中经过指令指定上下文中的文件。若是要提升构建性能,能够经过.dockerignore排除上下文中的某些文件或目录。ide

格式

# Comment
INSTRUCTION arguments

指令不区分大小写,可是惯例使用大写,以便将它们和参数区分开来。工具

Docker按顺序执行Dockerfile中的指令。一个Dockerfile必须用FROM指令启动。性能

Docker使用#做为注释的开头。ui

Dockerfile指令

FROM

指定基础镜像,一般咱们会基于某个基础镜像定制本身的镜像,在DockerStore上有不少的官方镜像,咱们能够基于这些镜像来定制本身的镜像。若是没有找到对应的镜像,官方镜像中还提供了一些更为基础的操做系统镜像;除此以外,还存在一个名为scratch的特殊镜像,这个镜像并不实际存在,是一个空白的镜像。url

FROM <image> [AS <name>]

or操作系统

FROM <image>[:<tag>] [AS <name>]

or

FROM <image>[@<digest>] [AS <name>]

RUN

执行命令行命令。

RUN有两种形式:

  • RUN <command> (shell格式,该命令在shell中运行,默认状况下/bin/sh -c在Linux或cmd /S /C Windows上运行)
  • RUN ["executable", "param1", "param2"](exec格式)

CMD

指定容器主进程的启动命令。在运行时能够指定新的命令来代替这个默认命令。

CMD指令有三种格式:

  • CMD ["executable","param1","param2"] (exec格式,通常推荐使用的格式)
  • CMD ["param1","param2"] (参数列表格式)
  • CMD command param1 param2 (shell格式)

LABEL

LABEL <key>=<value> <key>=<value> <key>=<value> ...

LABEL指令添加元数据到镜像中。若是要使用包含有空格的元数据,能够给key-value加上引号。

MAINTAINER

MAINTAINER <name>

这个指令设置镜像的维护者。而LABEL更加灵活,能够设置任何须要的元数据,而且能够轻松查看。要设置MAINTAINER信息可使用LABEL进行设置:

LABEL maintainer="SvenDowideit@home.org.au"

EXPOSE

EXPOSE <port> [<port>/<protocol>...]

EXPOSE指令告诉Docker容器在运行时监听指定的网络端口。若是未指定协议,则默认为TCP。

EXPOSE指令仅仅是声明运行时容器打算使用什么端口,并不会自动在宿主进行端口映射。

ENV

ENV <key> <value>
ENV <key>=<value> ...

ENV指令将环境变量<key>设置为值<value>。这个值将在构建阶段中的全部后续指令环境中。

COPY

复制文件。

COPY有两种格式:

COPY <src>... <dest>
COPY ["<src>", ... "<dest>"]

ADD

更高级的复制文件

ADD指令和COPY基本一致,可是在COPY的基础上加强了一些功能。好比源文件能够是一个URL,在这种状况下,Docker会试图去下载这个连接的文件放到目标路径中,下载后的文件权限自动设置为600,若是这个权限不是想要的权限,那么还须要增长额外的RUN进行权限调整,何况,若是下载的是压缩包,还须要解压缩。因此不如直接调用RUN指令,而后使用wget或者curl工具下载,这个功能并不推荐使用。

若是源文件是一个tar压缩包的话,压缩格式为gzip,bzip2以及xz的状况下,ADD指令将会自动解压缩这个压缩文件到目标路径中,在某些状况下这个自动解压缩的功能很是有用。

ENTRYPOINT

入口点

ENTRYPOINT的格式和RUN指令格式同样,分为exec格式和shell格式。

ENTRYPOINT的目的和CMD同样,都是指定了容器启动的参数。ENTRYPOINT在运行时也能够被替代,须要经过docker run的参数-entrypoint来指定。

若是指定了ENTRYPOINT指令,CMD就再也不是直接运行了,而是将CMD的内容做为参数传递给ENTRYPOINT指令。

ARG

构建参数

ARG <name>[=<defaul value>]

构建参数和ENV的效果同样,都是设置环境变量。不一样的是,ARG所设置的构建环境的环境变量在未来容器运行时是不会存在的。

VOLUME

定义匿名卷

VOLUME ["/data"]

WORKDIR

指定工做目录。

使用WORKDIR指令能够指定工做目录。

USER

指定当前用户。

相关文章
相关标签/搜索