云原生学习笔记(六) 一文学会使用 Dockerfile:构建镜像的黄金剧本

📓 前言

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 编写建议

  1. 选择轻量镜像 :如 alpine,减小体积、提升构建速度。

  2. 减少层数 :将多个 RUN 命令合并。

    dockerfile 复制代码
    RUN apt update && apt install -y curl && rm -rf /var/lib/apt/lists/*
  3. 使用 .dockerignore:避免将无关文件复制进镜像。

  4. 固定版本号:确保构建的可重复性。

  5. 使用 ENTRYPOINT + CMD 组合:提高灵活性。

  6. 利用缓存优化构建顺序:常变的文件放后面。

  7. 多阶段构建(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 高效集成

相关推荐
至乐活着21 分钟前
Spring Boot 3.x核心特性深度解析:拥抱Java 17与云原生时代
spring boot·云原生·graalvm·java 17·虚拟线程
FJW0208141 小时前
阿里云RDS数据库账号创建案例
云原生
leijiwen11 小时前
Bsin-PaaS(毕昇)——LinkLifeVerse OS 的产业智能工程底座
云原生·云计算·paas
her_heart1 天前
ChatGPT 5.6 实战:用 AI 做云成本治理,从账单复盘到 K8s 优化
人工智能·云原生·chatgpt·kubernetes·测试用例
DolphinScheduler社区1 天前
Apache DolphinScheduler 6 月治理优化,补齐调度运维全链路细节
大数据·运维·云原生·apache·海豚调度
AOwhisky2 天前
Python 学习笔记(第三期)——流程控制:条件判断与循环结构
运维·笔记·python·学习·云原生·流程控制·循环
Waay2 天前
Linux 三个核心环境变量配置文件、作用域、生效方式完整梳理
linux·运维·学习·云原生·容器
SelectDB2 天前
云数仓费钱?用 SelectDB Serverless 三步配出秒级弹性,最高降本 70%
数据库·云原生·数据分析
CHrisFC2 天前
2026-07-15-csdn-硕晟LIMS微服务架构设计
微服务·云原生·架构