Dockerfile 简介
Dockerfile 是一个文本文件,用于定义 Docker 镜像的构建过程。它包含一系列指令和参数,描述了如何从一个基础镜像开始,安装软件、配置环境、添加文件,最终创建一个可以运行的容器镜像。通过 Dockerfile,你可以自动化镜像的创建过程,确保环境的一致性和可重复性。
Dockerfile 基本结构
一个典型的 Dockerfile 包含以下部分:
- 基础镜像声明:使用
FROM
指令指定基础镜像。 - 环境设置:使用
ENV
指令设置环境变量。 - 依赖安装:使用
RUN
指令执行命令安装软件包。 - 文件复制:使用
COPY
或ADD
指令将文件从宿主机复制到镜像中。 - 工作目录设置:使用
WORKDIR
指令设置工作目录。 - 容器启动命令:使用
CMD
或ENTRYPOINT
指令定义容器启动时执行的命令。
常用 Dockerfile 指令
以下是 Dockerfile 中常用指令的说明和示例:
1. FROM
– 指定基础镜像
FROM python:3.9-slim
说明:指定使用 Python 3.9 的轻量级镜像作为基础。
2. RUN
– 执行命令
RUN apt-get update && apt-get install -y \
python3-dev \
build-essential \
&& rm -rf /var/lib/apt/lists/*
说明:更新包索引并安装开发工具,最后清理缓存以减小镜像大小。
3. COPY
– 复制文件
COPY requirements.txt .
COPY app.py .
COPY templates/ /app/templates/
说明:将宿主机的文件复制到镜像中。
4. WORKDIR
– 设置工作目录
WORKDIR /app
说明:设置后续命令的工作目录为 /app
。
5. ENV
– 设置环境变量
ENV PYTHONUNBUFFERED 1
ENV FLASK_APP=app.py
说明:设置 Python 不缓冲输出,并指定 Flask 应用入口。
6. EXPOSE
– 声明端口
EXPOSE 5000
说明:声明容器运行时会监听的端口,但不会实际映射端口。
7. CMD
– 容器启动命令
CMD ["flask", "run", "--host=0.0.0.0"]
说明:定义容器启动时执行的命令。
8. ENTRYPOINT
– 容器入口点
ENTRYPOINT ["python", "app.py"]
CMD ["--port=5000"]
说明:设置容器入口点,CMD 的内容会作为参数传递给 ENTRYPOINT。
Dockerfile 示例
下面是一个完整的 Flask Web 应用的 Dockerfile 示例:
# 使用 Python 3.9 轻量级镜像作为基础
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 设置环境变量
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# 安装系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends gcc python3-dev
# 安装 Python 依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制项目文件
COPY . .
# 暴露端口
EXPOSE 5000
# 定义启动命令
CMD ["flask", "run", "--host=0.0.0.0"]
构建镜像
使用以下命令根据 Dockerfile 构建镜像:
docker build -t my-flask-app:1.0 .
说明:
-t
:指定镜像标签(名称和版本).
:指定构建上下文路径(Dockerfile 所在目录)
最佳实践
- 分层构建:将不常变化的步骤(如安装依赖)放在前面,常变化的步骤(如复制源代码)放在后面,以充分利用镜像缓存。
- 减小镜像大小:使用轻量级基础镜像,清理不必要的文件和缓存。
- 单一职责:每个容器只运行一个进程,保持容器的轻量和专注。
- 避免敏感信息:不要在 Dockerfile 中包含敏感信息(如密码、API 密钥)。
通过编写 Dockerfile,你可以创建可重复、可移植的应用环境,大大简化开发、测试和部署流程。
命令示例
docker build -f avis/Dockerfile -t avis .
docker run -d -v ~/agentql/avis_output:/app/avis/outputs avis