缓存高效 Dockerfile 指南 docker buildx / buildKit

在底层,我们使用 buildkit(或 docker buildx) 来构建 docker 镜像。这使我们能够利用高级缓存机制来缩短构建时间并减少资源消耗。在本指南中,我们将提供一些创建缓存高效 Dockerfile 的指南。

在底层,我们使用 buildkit(或 docker buildx) 来构建 docker 镜像。这使我们能够利用高级缓存机制来缩短构建时间并减少资源消耗。在本指南中,我们将提供一些创建缓存高效 Dockerfile 的指南。

简介

构建缓存高效 Dockerfile 对于缩短构建时间和减少资源消耗至关重要。 Docker Buildx 和 BuildKit 提供了增强缓存机制的高级功能。本文档提供了创建此类 Dockerfile 的指南。

如果您想在本地测试容器,请确保在 Docker 环境中启用了 Docker Buildx 和 BuildKit。否则,您无需担心。当您使用容器支持部署应用程序时,fal 平台会为您处理此事。

查看 Docker buildx 文档 了解更多信息。

常规指南

1.最小化层

每个 RUNCOPYADD 指令都会创建一个新层。通过组合命令来最小化层数。

坏例子:

dockerfile
RUN apt-get update
RUN apt-get install -y curl

好例子:

dockerfile
RUN apt-get update && apt-get install -y curl

2.利用层缓存

按从最少到最多更改的顺序排列指令,以最大化层缓存。

示例:

dockerfile
# Install dependencies (changes less frequently)
COPY requirements.txt /app/
RUN pip install -r requirements.txt

# Copy application code (changes more frequently)
COPY . /app

3.使用 --mount=type=cache

利用 BuildKit 的 --mount=type=cache 在构建过程中缓存目录。

示例:

dockerfile
# syntax=docker/dockerfile:1.3-labs
FROM python:3.9

# Use BuildKit cache for pip
RUN --mount=type=cache,target=/root/.cache/pip \
    pip install --upgrade pip

COPY requirements.txt /app/
RUN --mount=type=cache,target=/root/.cache/pip \
    pip install -r requirements.txt

COPY . /app

4.多阶段构建

使用多阶段构建通过仅从中间阶段复制必要的工件来减小最终映像大小。

示例:

dockerfile
# syntax=docker/dockerfile:1.3
FROM python:3.9 AS builder
WORKDIR /app
COPY . .
RUN pip install --upgrade pip \
 && pip install -r requirements.txt

FROM python:3.9-slim
COPY --from=builder /app /app
WORKDIR /app
ENTRYPOINT ["python", "app.py"]

5.安装后清理

安装软件包后删除不必要的文件和缓存,以保持镜像大小较小。

示例:

dockerfile
RUN apt-get update && apt-get install -y \
    build-essential \
 && rm -rf /var/lib/apt/lists/*

6.使用 .dockerignore

指定在构建过程中要忽略的文件和目录,以避免构建上下文中出现不必要的文件。

示例:

dockerfile
__pycache__
*.pyc
*.pyo

示例 Dockerfile

以下是使用上述原则的缓存高效 Dockerfile 示例:

dockerfile
# syntax=docker/dockerfile:1.3
FROM python:3.9 AS base
WORKDIR /app

# 安装依赖项
COPY requirements.txt ./
RUN --mount=type=cache,target=/root/.cache/pip \
    pip install --upgrade pip \
 && pip install -r requirements.txt

# 复制源文件
COPY . .

# 构建应用程序
RUN python setup.py build

# 生产映像
FROM python:3.9-slim
COPY --from=base /app /app
WORKDIR /app
ENTRYPOINT ["python", "app.py"]

fal 平台特定陷阱

在 fal 平台上部署应用程序时,您无需担心启用 Docker Buildx 或 BuildKit。我们会为您处理。但是,您可以遵循上述指南来创建高效的 Dockerfile,这将有助于加快构建过程并减少资源消耗。

1.与本地文件系统交互

目前不支持COPYADD(从本地文件系统)将文件从主机复制到容器中。相反,您可以使用fal的fal.toolkit上传文件并使用链接在容器中引用它们。

py
json_url = File.from_path("my-file.json", repository="cdn").url

dockerfile_str = f"""
FROM python:3.11-slim
RUN apt-get update && apt-get install -y curl
RUN curl '{json_url}' > my-file.json
"""

或者您可以使用ADD直接从URL下载文件:

py
json_url = File.from_path("requirements.txt", repository="cdn").url

dockerfile_str = f"""
FROM python:3.11-slim
ADD {json_url} /app/requirements.txt
WORKDIR /app
RUN pip install -r requirements.txt
"""

结论

通过遵循这些准则,您可以创建高效构建的Dockerfile并充分利用Docker Buildx和BuildKit的缓存功能。这将缩短构建时间并减少资源使用。

有关更多详细信息,请参阅Docker文档

最后更新于 2024 年 6 月 26 日