Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像。
1.基本结构
Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。一般而言,Dockerfile主体内容分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
示例:
2.指令说明
Dockerfile中指令的一般格式为INSTRUCTION arguments,包括“配置指令”(配置镜像信息)和“操作指令”(具体执行操作)
2.1ARG
定义创建镜像过程中使用的变量。格式为ARG <name>[=<default value>]。在执行docker build时,可以通过-build-arg[=]来为变量赋值。当镜像编译成功后,ARG指定的变量将不再存在(ENV指定的变量将在镜像中保留)。Docker内置了一些镜像创建变量,用户可以直接使用而无须声明,包括(不区分大小写)HTTP_PROXY、HTTPS_PROXY、FTP_PROXY、NO_PROXY。
2.2FROM
指定所创建镜像的基础镜像。格式为FROM <image> [AS <name>]或FROM <image>:<tag> [AS <name>]或FROM<image>@<digest> [AS <name>]。任何Dockerfile中第一条指令必须为FROM指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次)。为了保证镜像精简,可以选用体积较小的镜像如Alpine或Debian作为基础镜像。例如:
2.3LABEL
其实就是一个辅助信息,算是备注或注释吧
2.4EXPOSE
可以暴露多个端口
2.5ENV
2.6ENTRYPOINT
关于entrypoint与cmd命令,我不太懂怎么使用,于是找到了这样的帖子讲的还是比较易懂的:https://yeasy.gitbook.io/docker_practice/image/dockerfile/entrypoint
2.7VOLUME
创建一个数据卷挂载点。格式为VOLUME ["/data"]。运行容器时可以从本地主机或其他容器挂载数据卷,一般用来存放数据库和需要保持的数据等。
2.8USER
2.9WORKDIR
2.10 ONBUILD
2.11 STOPSIGNAL
2.12 HEALTHCHECK
2.13 SHELL
3.操作指令
3.1 RUN
3.2 CMD
3.3 ADD
3.4 COPY
复制内容到镜像。格式为COPY <src> <dest>。复制本地主机的<src>(为Dockerfile所在目录的相对路径,文件或目录)下内容到镜像中的<dest>。目标路径不存在时,会自动创建。路径同样支持正则格式。COPY与ADD指令功能类似,当使用本地目录为源目录时,推荐使用COPY。
4.创建镜像
编写完成Dockerfile之后,可以通过docker [image] build命令来创建镜像。基本的格式为docker build [OPTIONS] PATH | URL | -。
该命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下所有数据作为上下文(Context)发送给Docker服务端。Docker服务端在校验Dockerfile格式通过后,逐条执行其中定义的指令,碰到ADD、COPY和RUN指令会生成一层新的镜像。最终如果创建镜像成功,会返回最终镜像的ID。
如果上下文过大,会导致发送大量数据给服务端,延缓创建过程。因此除非是生成镜像所必需的文件,不然不要放到上下文路径下。如果使用非上下文路径下的Dockerfile,可以通过-f选项来指定其路径。
要指定生成镜像的标签信息,可以通过-t选项。该选项可以重复使用多次为镜像一次添加多个名称。例如,上下文路径为/tmp/docker_builder/,并且希望生成镜像标签为builder/first_image:1.0.0,可以使用下面的命令: