一、Dockerfile 简介
Dockerfile是用于构建 Docker 镜像的脚本文件, 由一系列指令构成。 通过 docker build
命令构建镜像时,Dockerfile 中的指令会由上到下依次执行, 每条指令都将会构建出一个镜像。 这就是镜像的分层。 因此, 指令越多, 层次就越多,创建的镜像就越多, 效率就越低。
所以在定义 Dockerfile 时, 能在一个指令完成的动作就不要分为两条 。
二、指令简介
对于Dockerfile 的指令,需要注意以下几点:
- 指令是大小不敏感的,但惯例是写为全大写。
- 指令后至少会携带一个参数。
- #号开头的行为注释。
1、FROM
【语法】 FROM <image>:<tag>
【解析】用于指定基础镜像, 且必须是第一条指令 ;若省略了 tag 则 默认为 latest 。
2、MAINTAINER
【语法】MAINTAINER <name>
【解析】MAINTAINER 指令的参数填写的一般是维护者姓名和信箱。 不过,该指令官方已不建议使用,而是使用 LABEL 指令代替。
3、LABEL
【语法】LABEL <key>=<value><key>=<value> ......
【解析】LABEL 指令中可以以键值对的方式包含任意镜像的元数据信息,用于替代MAINTAINER 指令 。 通过 docker inspect
可查看到 LABEL 与 MAINTAINER 的内容。
4、ENV
【语法1】ENV <key> <value>
【解析】用于指定环境变量,这些环境变量,后续可以被 RUN 指令使用,容器运行起来之后,也可以在容器中获取这些环境变量。
【语法2】ENV <key1>=<value1> <key2>=<value2>...
【解析】可以设置多个变量,每个变量为一 对 <key1>=<value1>
指定。
5、WORKDIR
【语法】WORKDIR path
【解析】容器打开后默认进入的目录一般在后续的 RUN 、 CMD 、 ENTRYPOINT 、 ADD 等指令中会引用该目录 。 可以设置多个 WORKDIR 指令 。 后续 WORKDIR 指令若用的是相对路径,则会基于之前 WORKDIR 指令指定的路径。
在使用 docker run
运行容器时,可以通过 -w
参数覆盖构建时所设置的工作目录。
WORKDIR /usr
WORKDIR local
#这个local就是基于/usr的
#多层也一样,都是基于前面的
docker run -it 容器
进入容器后者进入/usr/local目录
docker run -w /root -it cent7#进去会改变路径,覆盖了 原来的/usr/local
6、RUN
【语法1】RUN <command>
【解析】这里的就是 shell 命令。 docker build
执行过程中,会使用 shell 运行指定的 command 。
【语法2】RUN ["EXECUTABLE","PARAM1","PARAM2" PARAM2",...]
【解析】在 docker build
执行过程中,会调用第一个参数"EXECUTABLE"指定的应用程序运行,并使用后面第二、三等参数作为 应用程序的运行参数 。
7、CMD
【语法1】CMD ["EXECUTABLE","PARAM1"," PARAM2",...]
【解析】在容器启动后 ,即在执行完 docker run
后会立即调用执行"EXECUTABLE" 指定的可执行文件,并使用后面第二、三等参数作为应用程序的运行参数。
【语法2】CMD command param1 param2 ,...
【解析】这里的 command 就是 shell 命令。在 容器启动后会立即运行指定的 shell 命令。
【语法3】CMD ["PARAM1"," PARAM2",...]