本文记录如何将一个 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 的种种问题。