Dockerfile书写规则

简介

Dockerfile类似于Makefile,包含有多条构建指令,Docker可以通过Dockerfile自动生成自定义镜像。

用法

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

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

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

在Dockerfile中通过指令指定上下文中的文件。如果要提高构建性能,可以通过.dockerignore排除上下文中的某些文件或目录。

格式

# Comment
INSTRUCTION arguments

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

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

Docker使用#作为注释的开头。

Dockerfile指令

FROM

指定基础镜像,通常我们会基于某个基础镜像定制自己的镜像,在DockerStore上有很多的官方镜像,我们可以基于这些镜像来定制自己的镜像。如果没有找到对应的镜像,官方镜像中还提供了一些更为基础的操作系统镜像;除此之外,还存在一个名为scratch的特殊镜像,这个镜像并不实际存在,是一个空白的镜像。

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="[email protected]"

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

指定当前用户。

猜你喜欢

转载自www.cnblogs.com/yiningv/p/10356976.html