如何将 Python 应用 Docker 化

文章目录
  1. 1. 一个自动轮询脚本
    1. 1.1. 目录结构
    2. 1.2. Docker 操作
      1. 1.2.1. 编译镜像
      2. 1.2.2. 导出镜像
      3. 1.2.3. 启动容器
  2. 2. 使用 Alpine Linux 的坑

本文记录如何将一个 Python 应用 Docker 化。

一个自动轮询脚本

第一个例子是一个自动轮询的脚本。

目录结构

项目的目录结构如下:

1
2
3
4
5
project/
main.py
requirements.txt
Dockerfile
.dockerignore

Dockerfile:

1
2
3
4
5
6
7
8
FROM python:3.9-slim
WORKDIR /app

COPY requirements.txt ./
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

COPY main.py ./
CMD [ "python", "-u", "main.py" ]

Docker 操作

编译镜像

在项目根目录下运行:

1
docker build -t IMAGE_NAME .

导出镜像

将编译好的镜像导出成 tar 文件,方便导入群晖 NAS:

1
docker save -o docker-image.tar IMAGE_NAME

启动容器

1
docker run --name CONTAINER_NAME -e ENV_VARIABLE_1="VALUE" -e ENV_VARIABLE_2="VALUE" IMAGE_NAME

当然,某些容器需要端口映射:

1
-p HOST_PORT:INSIDE_PORT

使用 Alpine Linux 的坑

事实上并不推荐使用 Alpine Linux 作为基底镜像,因为 Alpine 不支持 PyPI 上已经编译好的 wheel 包,而是需要 pip install 时本地编译——比如 numpy 之类的含 C/C++ 包。

因此更推荐使用 python:3.9-slim 镜像作为基底镜像,避开 Alpine 的种种问题。