07_dockerfile/README.md
Dockerfile 是一个文本文件,其内包含了一条条的 指令 (Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
在第四章中,我们通过 docker commit 学习了镜像的构成。但是,手动 commit 只能作为临时修补,并不适合作为生产环境镜像的构建方式。
使用 Dockerfile 构建镜像有以下优势:
docker build 命令自动构建镜像。在深入每个指令的细节之前,笔者想强调一个至关重要的原则:Dockerfile 不是脚本,而是镜像的“设计图”。这个区别决定了你如何思考每条指令的作用。
相比编写 Bash 脚本的思维(“按顺序执行这些命令”),Dockerfile 的思维应该是(“这一层镜像应该如何构建,下一层如何分层”)。这个思维转变会影响你的决策:
RUN apt-get update && apt-get install ... 应该写在一起,而不是分开成多个 RUN 指令,因为它们是同一个“层”的逻辑COPY vs ADD、CMD vs ENTRYPOINT 这些选择不是随意的,而是根据镜像分层的语义来决定的这个章节将详细介绍各个指令。在学习指令语法时,请始终思考:“这个指令为什么要以这样的方式工作?如果我是 Docker,我应该如何设计它?”
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
本章将详细讲解 Dockerfile 中的各个指令:
本章还将介绍 Dockerfile 的高级特性:
此外,我们还将介绍 Dockerfile 的最佳实践和常见问题。
构建镜像的基本命令格式为:
docker build [选项] <上下文路径/URL/->
例如,在 Dockerfile 所在目录执行:
docker build -t my-image:1.0 .
本章中的 Dockerfile 示例使用的基础镜像标签遵循以下原则:
ubuntu:24.04、alpine、nginx):保持原样,无需修改node:22、python:3.12):使用主或次版本号而非完整版本号(patch),这样可以自动获取最新的补丁版本,确保获得安全更新latest 标签和完整的 patch 版本号(如 20.10.0)作为基础镜像,因为这会导致构建的不可重现性或安全风险读者在使用这些示例时,应根据实际生产环境需求选择合适的版本号。
更多关于 docker build 的用法,我们在实战中会结合具体指令进行演示。