Docker镜像(image)及容器(container)的构建

Dockerfile 简介

Dockerfile 是一个文本文件,用于定义 Docker 镜像的构建过程。它包含一系列指令和参数,描述了如何从一个基础镜像开始,安装软件、配置环境、添加文件,最终创建一个可以运行的容器镜像。通过 Dockerfile,你可以自动化镜像的创建过程,确保环境的一致性和可重复性。

Dockerfile 基本结构

一个典型的 Dockerfile 包含以下部分:

  • 基础镜像声明:使用 FROM 指令指定基础镜像。
  • 环境设置:使用 ENV 指令设置环境变量。
  • 依赖安装:使用 RUN 指令执行命令安装软件包。
  • 文件复制:使用 COPYADD 指令将文件从宿主机复制到镜像中。
  • 工作目录设置:使用 WORKDIR 指令设置工作目录。
  • 容器启动命令:使用 CMDENTRYPOINT 指令定义容器启动时执行的命令。

常用 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 所在目录)

最佳实践

  1. 分层构建:将不常变化的步骤(如安装依赖)放在前面,常变化的步骤(如复制源代码)放在后面,以充分利用镜像缓存。
  2. 减小镜像大小:使用轻量级基础镜像,清理不必要的文件和缓存。
  3. 单一职责:每个容器只运行一个进程,保持容器的轻量和专注。
  4. 避免敏感信息:不要在 Dockerfile 中包含敏感信息(如密码、API 密钥)。

通过编写 Dockerfile,你可以创建可重复、可移植的应用环境,大大简化开发、测试和部署流程。

命令示例

docker build -f avis/Dockerfile -t avis .

docker run -d -v ~/agentql/avis_output:/app/avis/outputs avis

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注