Python 是一门广泛使用的编程语言,在容器化环境中,构建和使用 Python 镜像是非常常见的任务。本文将提供一个完整的指南,包括选择基础镜像、制作流程、不同场景下的应用、安全性最佳实践以及镜像优化策略。

1. 选择合适的基础镜像

1.1 官方 Python 镜像

Docker Hub 提供了官方 Python 镜像,这是一个值得信赖的选择。它由 Python 官方维护,提供了最新的稳定版本和安全更新。

FROM python:3.9-slim
  • 1.

1.2 Alpine Linux 镜像

如果对镜像大小有要求,可以选择基于 Alpine Linux 的 Python 镜像。Alpine Linux 是一个轻量级的 Linux 发行版,适合容器化应用。

FROM python:3.9-alpine
  • 1.

1.3 自定义镜像

根据应用的需求,可以创建自定义的 Python 镜像,包含所需的依赖和配置。

  1. FROM debian:bullseye-slim
  2. # 安装 Python 和其他依赖
  3. RUN apt-get update && apt-get install -y python3 && rm -rf /var/lib/apt/lists/*
  4. # 添加应用代码
  5. COPY . /app
  6. WORKDIR /app
  7. # 设置环境变量等
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

使用amazonlinux容器镜像,制作自己的python 3.9镜像

  1. FROM public.ecr.aws/amazonlinux/amazonlinux:2023-minimal
  2. # 安装Python 3.9依赖和必要工具,下载、编译并安装Python 3.9,验证Python 3.9安装
  3. RUN dnf install -y tar zlib zlib-devel gcc openssl-devel bzip2-devel libffi-devel make && \
  4. curl -O https://www.python.org/ftp/python/3.9.7/Python-3.9.7.tgz && \
  5. tar -xzf Python-3.9.7.tgz && \
  6. cd Python-3.9.7 && ./configure --enable-optimizations && make && make install && \
  7. python3.9 --version && \
  8. rm -rf Python-3.9.7.tgz Python-3.9.7 && \
  9. dnf clean all && \
  10. rm -rf /var/cache/dnf /usr/share/doc /usr/share/man
  11. # 设置工作目录
  12. WORKDIR /app
  13. # 指定容器启动时执行的命令
  14. CMD ["/bin/bash"]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

2. 制作 Python 镜像的最佳实践

2.1 利用多阶段构建

使用多阶段构建可以减小最终镜像的大小,将构建过程中产生的临时文件保留在一个阶段,只将运行时需要的文件复制到最终镜像中。

  1. # 第一阶段:构建依赖
  2. FROM python:3.9-slim AS builder
  3. WORKDIR /app
  4. COPY requirements.txt .
  5. RUN pip install --no-cache-dir -r requirements.txt
  6. # 第二阶段:最终镜像
  7. FROM python:3.9-slim
  8. WORKDIR /app
  9. COPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
  10. COPY . .
  11. CMD ["python", "app.py"]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

3. 不同场景下的应用

3.1 Web 应用

对于基于 Python 的 Web 应用,可以使用 Gunicorn 或 uWSGI 作为应用服务器,并将其与 Nginx 或 Caddy 等反向代理结合使用。

  1. FROM python:3.9-slim
  2. WORKDIR /app
  3. COPY requirements.txt .
  4. RUN pip install --no-cache-dir -r requirements.txt
  5. COPY . .
  6. CMD ["gunicorn", "app:app", "--bind", "0.0.0.0:8000"]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

3.2 定时任务

对于定时任务,可以使用 cron 或类似的调度工具,并在镜像中运行任务脚本。

  1. FROM python:3.9-slim
  2. WORKDIR /app
  3. COPY requirements.txt .
  4. RUN pip install --no-cache-dir -r requirements.txt
  5. COPY . .
  6. CMD ["python", "scheduled_task.py"]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

4. 安全性最佳实践

4.1 最小权限原则

在 Dockerfile 中使用非 root 用户运行应用程序,以最小化潜在的攻击面。

  1. FROM python:3.9-slim
  2. WORKDIR /app
  3. COPY requirements.txt .
  4. RUN adduser --disabled-password myuser && \
  5. pip install --no-cache-dir -r requirements.txt
  6. USER myuser
  7. COPY . .
  8. CMD ["python", "app.py"]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

4.2 更新基础镜像和依赖

定期更新基础镜像和依赖,以确保应用程序使用最新的安全版本。

  1. FROM python:3.9
  2. RUN pip install --no-cache-dir --upgrade pip
  • 1.
  • 2.

5. 镜像优化策略

5.1 多阶段构建

通过多阶段构建,只保留最终运行时所需的组件,减小镜像大小。

  1. # 第一阶段:构建和测试
  2. FROM python:3.9-slim AS builder
  3. WORKDIR /app
  4. COPY requirements.txt .
  5. RUN pip install --no-cache-dir -r requirements.txt
  6. # 添加其他构建步骤
  7. # 第二阶段:最终镜像
  8. FROM python:3.9-slim
  9. WORKDIR /app
  10. COPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
  11. COPY . .
  12. CMD ["python", "app.py"]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

基于 NVIDIA CUDA 12.1.0 运行时的 Python 环境镜像,容器使用gpu运行自己服务

  1. # 第一阶段:构建Python
  2. FROM nvidia/cuda:12.1.0-runtime-ubi8 AS builder
  3. RUN dnf update -y && dnf install -y tar zlib zlib-devel gcc openssl-devel bzip2-devel libffi-devel make && \
  4. curl -O https://www.python.org/ftp/python/3.9.7/Python-3.9.7.tgz && \
  5. tar -xzf Python-3.9.7.tgz && \
  6. cd Python-3.9.7 && ./configure --enable-optimizations && make && make install && \
  7. python3.9 --version && \
  8. rm -rf Python-3.9.7.tgz Python-3.9.7 && \
  9. dnf clean all && \
  10. rm -rf /var/cache/dnf
  11. # 第二阶段:运行环境
  12. FROM nvidia/cuda:12.1.0-runtime-ubi8
  13. COPY --from=builder /usr/local /usr/local
  14. COPY requirements.txt /tmp/requirements.txt
  15. RUN mkdir /code \
  16. && pip3 install --upgrade pip \
  17. && pip3 install --default-timeout=1000 --no-cache-dir -r /tmp/requirements.txt \
  18. && pip3 install opencv-python-headless
  19. WORKDIR /code
  20. COPY govee_light_ai_v1/ .
  21. EXPOSE 8000
  22. CMD gunicorn -w 2 -b 0.0.0.0:8000 app_lamp:app
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

5.2 懒加载依赖

延迟加载应用程序的依赖项,根据需要在运行时下载。

  1. FROM python:3.9-slim
  2. WORKDIR /app
  3. COPY requirements.txt .
  4. CMD ["pip", "install", "--no-cache-dir", "-r", "requirements.txt"]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

5.3 资源清理

在构建过程中清理不必要的文件和依赖,减小镜像体积。

  1. FROM python:3.9-slim AS builder
  2. WORKDIR /app
  3. COPY requirements.txt .
  4. RUN pip install --no-cache-dir -r requirements.txt
  5. # 其他构建步骤
  6. # 清理不必要的文件
  7. RUN rm -rf /usr/local/lib/python3.9/site-packages/tests && \
  8. rm -rf /usr/local/lib/python3.9/site-packages/test
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

通过遵循这些建议,您将能够创建更安全、高效且适应不同场景的 Python 镜像。这些实践将有助于提高容器化应用程序的性能、安全性和可维护性。