Dockerfile书写规则
Posted yiningv
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
指定当前用户。
以上是关于Dockerfile书写规则的主要内容,如果未能解决你的问题,请参考以下文章