python-pip

2023-11-06

使用 Dockerfile 部署 Python 服务的几种方式,同时也支持通过 Docker Compose 进行构建和运行,配置可参考:dockerfile.yml

Poetry

通过 Poetry 构建和运行:

1
FROM python:3.12
2
3
# 将当前工作目录设置为 /code
4
WORKDIR /code
5
6
# 拷贝依赖文件
7
COPY pyproject.toml poetry.lock /code/
8
RUN pip install -i https://pypi.douban.com/simple/ poetry
9
RUN poetry install --no-root --no-directory
10
11
# 拷贝项目数据到 code 目录
12
COPY . /code/
13
RUN poetry install --no-dev
14
15
# 声明要监听的端口
16
EXPOSE 5000
17
18
# 使用配置文件
19
CMD [ "poetry", "run", "gunicorn", "app.main:app", "--config", "config/gunicorn.py" ]
20
21
# 直接在参数中传递配置
22
# CMD [ "poetry", "run", "gunicorn", "app.main:app", "--workers", "2", "--worker-class", \
23
# "uvicorn.workers.UvicornWorker", "-b", "0.0.0.0:5000" ]

分阶段构建:

  1. 第一阶段先安装 poetry 导出依赖到 requirements.txt;
  2. 第二阶段通过导出的 requirements 文件使用 pip 进行安装依赖;

  3. 最后拷贝代码到 Docker 中。

1
FROM python:3.9-slim as export-reqs
2
3
WORKDIR /tmp
4
5
# 拷贝依赖文件
6
COPY pyproject.toml poetry.lock /tmp/
7
RUN pip install -i https://pypi.douban.com/simple/ poetry
8
9
# 从 Poetry 导出依赖到 requirements.txt
10
RUN poetry export -f requirements.txt --output requirements.txt --without-hashes
11
12
13
FROM python:3.12-slim-bookworm
14
15
# 将当前工作目录设置为 /code
16
WORKDIR /code
17
18
# 从 export-reqs 拷贝文件到工作目录
19
COPY --from=export-reqs /tmp/requirements.txt /code/
20
21
# 通过 pip 安装依赖
22
RUN pip install -i http://pypi.douban.com/simple/ --no-cache-dir --upgrade -r requirements.txt && rm requirements.txt
23
24
# 拷贝项目数据到 code 目录
25
COPY . /code/
26
27
# 创建保存数据的目录
28
RUN mkdir /data
29
30
# 声明要监听的端口
31
EXPOSE 5000
32
33
ENTRYPOINT [ "gunicorn", "app.main:app", "--config", "app/config/gunicorn.py" ]