📓 前言
Dockerfile 是构建 Docker 镜像的脚本文件,定义了镜像内应该包含的内容和构建步骤。掌握它,就等于掌握了容器化应用的核心生产力工具。
参考文档
🧱 一、Dockerfile 是什么?
Dockerfile 是一个文本文件 ,包含了一系列用于构建镜像的指令(Instructions)。这些指令会被 docker build
命令顺序执行,最终生成一个可运行的容器镜像。
🧩 二、Dockerfile 核心指令全览
一个标准的 Dockerfile 通常包括以下几个核心部分:
指令 | 作用 |
---|---|
FROM |
指定基础镜像(如 ubuntu , alpine , python ) |
RUN |
在构建镜像时运行命令(如安装依赖) |
COPY / ADD |
将本地文件复制到镜像中 |
WORKDIR |
设置工作目录 |
CMD / ENTRYPOINT |
设置容器启动时执行的命令 |
EXPOSE |
声明容器监听的端口(文档用途) |
ENV |
设置环境变量 |
ARG |
定义构建时变量 |
VOLUME |
定义挂载卷位置(持久化数据) |
LABEL |
添加元数据信息(如作者、版本) |
以下是构建镜像最常用的 Dockerfile 指令:
1. FROM
(基础镜像)
定义构建镜像所基于的父镜像。必须是第一条非注释指令。
dockerfile
FROM node:20-alpine
2. RUN
(执行命令)
在镜像构建时执行 shell 命令,常用于安装依赖、修改配置。
dockerfile
RUN apk add --no-cache python3
3. COPY
/ ADD
(复制文件)
将宿主机上的文件复制到镜像中。
COPY
:基础复制ADD
:支持远程 URL、自动解压 tar 文件
dockerfile
COPY . /app
ADD https://example.com/data.tar.gz /data/
4. WORKDIR
(设置工作目录)
设置后续指令的默认工作路径。
dockerfile
WORKDIR /app
5. CMD
/ ENTRYPOINT
(定义启动命令)
CMD
:容器默认启动命令,可被覆盖ENTRYPOINT
:更强制的启动命令(不容易被替换)
dockerfile
CMD ["node", "index.js"]
ENTRYPOINT ["python3", "main.py"]
🔎 CMD vs ENTRYPOINT 有啥区别?
项目 | CMD | ENTRYPOINT |
---|---|---|
默认命令 | ✅ | ✅ |
可被 docker run 覆盖 |
✅ | ❌(除非加 --entrypoint ) |
最常用途 | 提供默认命令参数 | 设置主命令(如 nginx ) |
结合使用:
dockerfile
ENTRYPOINT ["python"]
CMD ["app.py"]
6. EXPOSE
(声明端口)
声明容器运行时监听的端口(仅声明,不会自动映射主机端口)。
dockerfile
EXPOSE 8080
7. ENV
(设置环境变量)
dockerfile
ENV NODE_ENV=production
8. ARG
(构建参数)
在构建阶段可传递变量,通常与 --build-arg
配合使用。
dockerfile
ARG VERSION=1.0
RUN echo "Build version: $VERSION"
🧠 三、Dockerfile 编写建议
-
选择轻量镜像 :如
alpine
,减小体积、提升构建速度。 -
减少层数 :将多个
RUN
命令合并。dockerfileRUN apt update && apt install -y curl && rm -rf /var/lib/apt/lists/*
-
使用
.dockerignore
:避免将无关文件复制进镜像。 -
固定版本号:确保构建的可重复性。
-
使用
ENTRYPOINT
+CMD
组合:提高灵活性。 -
利用缓存优化构建顺序:常变的文件放后面。
-
多阶段构建(Multi-stage build): 只保留运行时必要内容,精简镜像体积。
🧪 四、示例:打包一个 Python Flask 应用
dockerfile
# 使用官方 Python 基础镜像
FROM python:3.10-slim
# 设置工作目录
WORKDIR /app
# 复制依赖文件并安装
COPY requirements.txt .
RUN pip install -r requirements.txt
# 复制源代码
COPY . .
# 暴露端口
EXPOSE 5000
# 启动应用
CMD ["python", "app.py"]
构建镜像:
bash
docker build -t flask-demo .
运行容器:
bash
docker run -p 5000:5000 flask-demo
🚫 五、常见坑点
COPY
顺序错 → 构建缓存失效RUN
安装完没清理缓存 → 镜像超大WORKDIR
未设置 → 程序路径混乱EXPOSE
没映射 → 容器内部服务无法访问ENTRYPOINT
写死 → 无法调试或扩展
🚀 六、总结
Dockerfile 是构建镜像的描述性语言,掌握它可以:
- 标准化部署流程
- 避免"在我电脑上可以跑"
- 与 CI/CD 高效集成