Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
主要指令
指令 | 行为 |
---|---|
FROM | 定制的镜像都是基于 FROM 的镜像,例如nginx |
WORKDIR | 指定下面的shell语句指定运行在哪个路径下 |
COPY | 将宿主机下的目录文件复制到镜像中去 |
RUN | 执行后面跟着的命令行命令 |
CMD | 指定整个镜像运行起来后执行的脚本 (一般都是阻塞式的脚本) |
1 | FROM alpine |
COPY vs ADD
两者功能差不多,但是ADD的源文件除了是本地文件资源,还可以是一个url
CMD vs ENTRYPOINT
ENTRYPOINT
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 –entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
在 Dockerfile 文件的存放目录下,通过docker build -t <镜像名>:<版本号>
命令来执行。
当两者混用时
- entrypoint非json,则以entrypoint为准。
- 如果entrypoint和cmd都是json,则以entrypoint+cmd拼接成的shell为准。
expose
expose仅仅只是声明端口。
作用:
- 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
- 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
VOLUME
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
作用:
- 避免重要的数据,因容器重启而丢失,这是非常致命的。
- 避免容器不断变大。
ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
ARG
构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。
label
标识(没实际作用)
onbuild
onbuild env C = 10
在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build