目录
[1 FROM:基础镜像选择](#1 FROM:基础镜像选择)
[1.1 指令简介](#1.1 指令简介)
[1.2 语法](#1.2 语法)
[1.3 选择策略](#1.3 选择策略)
[1.4 选择流程](#1.4 选择流程)
[1.5 示例](#1.5 示例)
[2 RUN:构建阶段命令执行](#2 RUN:构建阶段命令执行)
[2.1 指令简介](#2.1 指令简介)
[2.2 语法](#2.2 语法)
[2.3 执行技巧](#2.3 执行技巧)
[2.4 执行流程](#2.4 执行流程)
[2.5 示例](#2.5 示例)
[3 COPY:文件复制](#3 COPY:文件复制)
[3.1 指令简介](#3.1 指令简介)
[3.2 语法](#3.2 语法)
[3.3 实践建议](#3.3 实践建议)
[3.4 执行流程](#3.4 执行流程)
[3.5 示例](#3.5 示例)
[4 CMD:容器启动命令](#4 CMD:容器启动命令)
[4.1 指令简介](#4.1 指令简介)
[4.2 语法](#4.2 语法)
[4.3 与ENTRYPOINT的区别](#4.3 与ENTRYPOINT的区别)
[4.4 执行流程](#4.4 执行流程)
[4.5 示例](#4.5 示例)
[5 总结](#5 总结)
引言
Dockerfile是构建Docker镜像的自动化脚本,通过一系列指令描述镜像的构建过程,理解并掌握Dockerfile中的基础指令是高效使用Docker的前提。本文将解析Dockerfile中最常用的四个基础指令:
- FROM
- RUN
- COPY
- CMD
1 FROM:基础镜像选择
1.1 指令简介
- FROM指令是Dockerfile中的第一条指令,用于指定构建镜像的基础镜像
- 基础镜像可以是任何有效的Docker镜像,包括官方镜像、自定义镜像或私有仓库中的镜像
1.2 语法
FROM <image>[:<tag>] [AS <name>]
- :基础镜像的名称
- :基础镜像的标签,默认为latest
- AS :为构建阶段命名,便于多阶段构建
1.3 选择策略
选择合适的基础镜像对于构建高效、安全的Docker镜像至关重要,以下是一些选择策略:
- 官方镜像优先:使用Docker官方提供的镜像,如python、node、ubuntu等
- 轻量级镜像:如果不需要特定的功能,选择轻量级的镜像(如alpine)可以减少镜像体积
- 特定版本:根据应用需求选择合适的版本,避免使用latest标签以确保构建的一致性
1.4 选择流程

- 选择基础镜像:根据应用需求选择合适的基础镜像
- 是否需要特定功能?:判断应用是否需要特定的功能或依赖
- 选择包含所需功能的官方镜像:如果需要特定功能,选择相应的官方镜像
- 选择轻量级镜像:如果不需要特定功能,选择轻量级的镜像(如alpine)
- 确定版本:根据应用需求确定基础镜像的版本,避免使用latest
- 使用FROM指令指定镜像:在Dockerfile中使用FROM指令指定基础镜像
1.5 示例
FROM python:3.8-slim
2 RUN:构建阶段命令执行
2.1 指令简介
RUN指令用于在构建镜像时执行命令,合理使用RUN指令可以减少镜像层数,优化构建过程
2.2 语法
RUN <command>
RUN ["executable", "param1", "param2"]
2.3 执行技巧
-
链式命令:使用&&将多个命令串联起来,减少镜像层数,示例:
RUN apt-get update && apt-get install -y
git
curl
&& rm -rf /var/lib/apt/lists/* -
清理缓存:在执行安装命令后,清理缓存以减小镜像体积
2.4 执行流程

- 执行构建命令:在构建镜像时执行指定的命令
- 是否需要安装软件?:判断是否需要在镜像中安装软件
- 更新包列表:如果需要安装软件,先更新包列表
- 安装软件:安装所需的软件包
- 清理缓存:清理包管理器缓存以减小镜像体积
- 执行其他命令:如果不需要安装软件,执行其他需要的命令
- 减少镜像层数:通过链式命令和清理操作减少镜像层数
2.5 示例
RUN apt-get update && apt-get install -y \
git \
curl \
&& rm -rf /var/lib/apt/lists/*
3 COPY:文件复制
3.1 指令简介
- COPY指令用于将文件或目录从主机复制到镜像中
- COPY指令功能简单,但用途广泛,是构建Docker镜像时最常用的指令之一
3.2 语法
COPY <src>... <dest>
COPY ["<src>",... "<dest>"]
- :主机上的文件或目录
- :镜像中的目标路径
3.3 实践建议
- 使用绝对路径:尽量使用绝对路径,避免路径解析错误
- 复制必要的文件:只复制需要的文件,减少镜像体积
- 使用.dockerignore:使用.dockerignore文件排除不必要的文件,提高构建效率
3.4 执行流程

- 复制文件到镜像:使用COPY指令将文件从主机复制到镜像中
- 是否使用.dockerignore?:判断是否使用.dockerignore文件排除不必要的文件
- 排除不必要的文件:如果使用.dockerignore,排除不必要的文件
- 复制所有文件:如果不使用.dockerignore,复制所有文件
- 使用COPY指令:在Dockerfile中使用COPY指令进行复制
- 指定目标路径:指定文件在镜像中的目标路径
3.5 示例
COPY . /app
4 CMD:容器启动命令
4.1 指令简介
- CMD指令用于指定容器启动时的默认命令
- CMD指令可以被docker run命令中的参数覆盖
4.2 语法
CMD ["executable", "param1", "param2"]
CMD command param1 param2
4.3 与ENTRYPOINT的区别
可覆盖性:CMD指令可以被docker run命令中的参数覆盖,而ENTRYPOINT指令则不能被覆盖,除非使用--entrypoint参数
组合使用 :通常将ENTRYPOINT用于固定命令,将CMD
ENTRYPOINT ["python"] CMD ["app.py"]
用于默认参数
4.4 执行流程

- 指定容器启动命令:在Dockerfile中指定容器启动时的命令
- 使用CMD还是ENTRYPOINT?:判断使用CMD还是ENTRYPOINT指令
- CMD:如果使用CMD,指定默认命令,可以被docker run命令覆盖
- ENTRYPOINT:如果使用ENTRYPOINT,指定固定命令,docker run命令中的参数会作为参数传递
- 使用CMD指令:在Dockerfile中使用CMD指令指定默认命令
- 使用ENTRYPOINT指令:在Dockerfile中使用ENTRYPOINT指令指定固定命令
- 结合ENTRYPOINT指令传递固定命令:如果需要固定命令并传递参数,结合使用ENTRYPOINT和CMD指令
4.5 示例
CMD ["python", "app.py"]
5 总结
FROM、RUN、COPY和CMD是Dockerfile中最基础也是最常用的指令。掌握这些指令的使用方法和最佳实践,可以帮助我们构建高效、安全的Docker镜像。通过合理的指令组合和优化,可以显著提升镜像的构建效率和运行性能。