Dockerfile 是 Docker 镜像构建的核心工具,而其基本指令则是构建高效镜像的基础。掌握这些指令不仅能帮助我们更好地构建和优化镜像,还能提升容器化应用的部署效率。
本文将围绕 Dockerfile 的五大基本指令进行详细介绍,分别是 FROM
、RUN
、COPY
/ ADD
、WORKDIR
、CMD
/ ENTRYPOINT
,涵盖其原理、用法以及实战示例,帮助你全面掌握这些关键指令的使用。
一、FROM
:指定基础镜像
1.1 指令概述
- 功能:
FROM
指定镜像的构建基础,是所有 Dockerfile 的第一条指令。 - 作用:定义镜像的起点环境,例如选择操作系统或运行时环境。
1.2 语法
FROM <镜像名称>:<标签>
<镜像名称>
:可以是官方镜像或自定义镜像。<标签>
:指定镜像的版本,例如ubuntu:20.04
。
1.3 示例与应用场景
示例 1:基于官方的 Ubuntu 镜像
FROM ubuntu:20.04
示例 2:基于 Python 的运行时环境
FROM python:3.9-slim
- 应用场景:
- 构建 Web 应用时,可以选择
node
或python
镜像作为基础。 - 使用
alpine
镜像优化镜像体积,适合轻量级应用。
- 构建 Web 应用时,可以选择
二、RUN
:执行命令
2.1 指令概述
- 功能:
RUN
指令用于在构建镜像时运行命令。 - 作用:常用于安装软件、复制文件或执行其他初始化任务。
2.2 语法
RUN <命令>
<命令>
:可以是任何在基础镜像中支持的命令。
2.3 示例与应用场景
示例 1:安装 Nginx
RUN apt-get update && apt-get install -y nginx
示例 2:清理无用的缓存
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
- 应用场景:
- 安装依赖包(如 Node.js、Python 包、数据库工具)。
- 配置环境(如设置系统变量、创建目录)。
三、COPY
/ ADD
:将文件复制到容器内
3.1 指令概述
- 功能:
COPY
和ADD
都能将文件从宿主机复制到镜像中。 - 区别:
COPY
:仅支持本地文件和目录的复制。ADD
:支持解压归档文件、下载远程 URL 的文件。
3.2 语法
COPY <源路径> <目标路径>
ADD <源路径或URL> <目标路径>
3.3 示例与应用场景
示例 1:使用 COPY
复制本地文件
COPY ./app /usr/src/app
示例 2:使用 ADD
解压归档文件
ADD archive.tar.gz /usr/src/app
示例 3:使用 ADD
下载远程文件
ADD http://example.com/file.tar.gz /usr/src/app
- 应用场景:
- 将项目代码或配置文件复制到容器。
- 自动解压文件或下载依赖文件。
四、WORKDIR
:设置工作目录
4.1 指令概述
- 功能:
WORKDIR
用于指定镜像中的工作目录。 - 作用:在容器中运行命令时,默认路径会切换到设置的目录。
4.2 语法
WORKDIR <路径>
<路径>
:可以是绝对路径或相对路径。
4.3 示例与应用场景
示例 1:设置工作目录为 /app
WORKDIR /app
示例 2:创建嵌套目录
WORKDIR /usr/src/app
- 应用场景:
- 配合
COPY
将文件复制到指定目录。 - 配合
CMD
或ENTRYPOINT
设置运行命令的默认路径。
- 配合
五、CMD
/ ENTRYPOINT
:定义容器启动时的默认命令
5.1 指令概述
- 功能:
CMD
:定义容器启动时运行的默认命令,可被docker run
的参数覆盖。ENTRYPOINT
:定义容器启动时运行的固定命令,不易被覆盖。
5.2 语法
CMD
CMD ["可执行文件", "参数1", "参数2"]
ENTRYPOINT
ENTRYPOINT ["可执行文件", "参数1", "参数2"]
5.3 示例与应用场景
示例 1:使用 CMD
启动 Nginx
CMD ["nginx", "-g", "daemon off;"]
示例 2:使用 ENTRYPOINT
启动脚本
ENTRYPOINT ["python", "app.py"]
示例 3:配合 ENTRYPOINT
和 CMD
ENTRYPOINT ["python"]
CMD ["app.py"]
- 应用场景:
- 使用
CMD
提供灵活性,例如指定默认脚本。 - 使用
ENTRYPOINT
强制执行固定的命令(如启动服务)。
- 使用
六、完整案例:构建 Flask Web 应用
以下是一个完整的 Dockerfile,展示了 FROM
、RUN
、COPY
、WORKDIR
和 CMD
的实际用法。
6.1 项目结构
project/
├── app.py
├── requirements.txt
└── Dockerfile
app.py
:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello, Docker!"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
requirements.txt
:
flask
Dockerfile
:
# 指定基础镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 复制项目文件
COPY . .
# 安装依赖
RUN pip install -r requirements.txt
# 暴露端口
EXPOSE 5000
# 指定启动命令
CMD ["python", "app.py"]
6.2 构建与运行
构建镜像
docker build -t flask-app .
运行容器
docker run -d -p 5000:5000 flask-app
测试应用
访问浏览器中的 http://localhost:5000
,将看到 Hello, Docker!
。
七、总结
Dockerfile 的基本指令是容器化应用开发的核心。
通过 FROM
定义基础环境,利用 RUN
安装依赖,借助 COPY
/ ADD
传递资源,再通过 WORKDIR
配置工作路径,最终使用 CMD
/ ENTRYPOINT
启动应用,完成镜像的构建流程。
熟练掌握这些指令,不仅能帮助我们高效地构建镜像,还能优化容器的运行效率,为容器化应用开发打下坚实基础。