1. FROM

拉取 / 引用一个基础镜像,作为镜像构建的起点,后续所有指令全部叠加在此镜像之上

2. ENV

在镜像内写入环境变量

生效范围:镜像构建阶段(RUN 指令能够读取)、容器启动运行阶段(容器内所有进程均可读取该变量)

查看方式:

①进入正在运行的容器内部查看 env | grep 环境变量名

②在宿主机外部,不进容器 docker inspect 镜像 / 容器名

3. LABEL

向镜像元数据写入键值对信息(作者、版本、项目备注等)

特性:仅用于展示,不会生成新镜像文件层,不会改变容器运行逻辑

查看方式:

只能通过宿主机 docker inspect 镜像 / 容器名

4. WORKDIR

设置容器内部的工作目录路径;目录不存在则自动创建

影响:后续 RUN / COPY / ADD / CMD 等指令,全部以该目录作为默认工作路径

5. COPY

构建阶段将宿主机构建上下文目录中的文件,原样复制写入镜像文件层

特性:单纯文件拷贝,不会自动解压压缩包。日常复制文件优先使用 COPY

6. ADD

复制宿主机上下文文件到镜像内

特殊逻辑:如果源文件是本地 tar/tar.gz 压缩包,复制完成后自动解压到目标路径

7. RUN

构建阶段启动临时容器,执行命令;命令执行完成后,将容器内文件改动提交生成一层新的只读镜像层,临时容器销毁

用途:安装软件、源码编译、配置系统环境

8. EXPOSE

仅在镜像元数据中声明容器计划占用的端口

重点误区:不会自动开放端口、不会自动完成端口映射;外部访问容器仍然需要启动参数 -p

9. VOLUME

预先定义容器内的数据挂载目录

生效时机:构建(build)镜像阶段不执行挂载;容器启动时 Docker 自动创建可写挂载点,实现数据持久化,数据生命周期独立于容器

两种方式使用方式:

10. STOPSIGNAL

写入镜像配置,定义执行docker stop时发送给容器 PID1 进程的信号(例如 SIGQUIT 适配 nginx 优雅退出)

11. ENTRYPOINT

定义容器启动时执行的主程序

优先级:高于 CMD;docker run 追加的参数,会传递给 ENTRYPOINT,不会覆盖 ENTRYPOINT 本身程序

12. CMD

定义容器默认启动指令 / 默认参数

两种场景:

① 单独使用:docker run 不带额外参数则执行 CMD;run 后追加命令会直接完整覆盖 CMD ② 搭配 ENTRYPOINT:CMD 充当 ENTRYPOINT 的默认参数

总结:

COPY、ADD、RUN在临时容器执行,会修改文件系统(rootfs),生成新镜像只读层;

ENV、LABEL、WORKDIR、EXPOSE、VOLUME、STOPSIGNAL、ENTRYPOINT、CMD执行时不会启动临时容器、不会新增实体文件,仅修改镜像配置

实体文件:占用磁盘数据块、真实存储数据的文件

更多推荐