镜像构建过程
Dockerfile描述了组装镜像的步骤,其中每条指令都是单独执行的。除了FROM指令,其他每一条指令都会在上一条指令所生成镜像的基础上执行,执行完成后会生成一个新的镜像层,新的镜像层覆盖在原来的镜像之上从而形成了新的镜像。Dockerfile所生成的最终镜像就是在基础镜像上面一层层的镜像组建的。
指令
备注:指令不区分大小写,但是为了与参数区分,推荐大写。Docker会顺序执行Dockerfile中的指令,第一条指令必须是FROM指令,它用于指定构建镜像的基础镜像。在Dockerfile中以#开头的行是注释,而在其他位置出现的#会被当成参数。
- 声明环境变量:
ENV <key> <value>
或ENV <key>=<value>
- 为后面的镜像提供基础镜像:
FROM <image>
或FROM <image>:<tag>
- 复制到镜像:
COPY <src> <dest>
ADD <src> <dest>
- 区别:
ADD的 <src>
可以是指向网络文件的URL,也可以指向一个本地压缩归档文件,该文件在复制到容器中会被解压提取,若URL中的文件为归档文件则不会被解压。一般推荐使用COPY
,因为COPY
只支持本地文件,相比ADD
更透明。
- 容器中运行命令:
RUM <command>
(shell格式)RUN ["executable","param1","param2"]
(exec格式,推荐格式)- 区别:shell格式命令通过 /bin/sh -c 运行;exec格式命令是直接运行的,容器不调用shell程序,即容器中没有shell程序。exec中的参数会当成json数组被docker解析,故必须使用双引号而不能使用单引号。
- 指令:
CMD <command>
(shell格式)CMD ["executable","param1","param2"]
(exec格式,推荐格式)CMD ["param1","param2"]
(为ENTRYPOINT指令提供参数)- 一个Dockerfile中可以有多条CMD命令,但只有最后一条CMD命令有效。CMD与RUN在容器中运行方式相同,不同在于RUN在构建镜像时执行命令,并生成新的镜像;CMD在构建镜像并不执行命令,而是在容器启动时默认将CMD作为第一条执行的命令。如果用户在命令时指定了命令参数,则会覆盖CMD指令中的命令。