yan's blog

Python Dockerfile example

直入正题,示例 dockerfile 如下

FROM python:3.9.2-slim as build

# 如果有大文件的话,建议先用 .dockerignore 忽略
COPY . /app/

WORKDIR /app

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

FROM gcr.io/distroless/python3
COPY --from=build /app /app
COPY --from=build /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages 
ENV PYTHONPATH=/usr/local/lib/python3.9/site-packages 
WORKDIR /app
EXPOSE 6000
ENV TZ="Asia/Shanghai"

CMD ["-u","jira.py"]

这里有几个注意点

  1. 最开始 Python 的版本为什么是3.9.2?因为我们最后运行的 Python 的版本是 3.9.2
  2. 注意这里使用了两阶段 build,至于为什么使用 distroless的镜像,请参考Google distroless image
  3. 为什么是把 site-packages 移动走,是收到了此博文的启发
  4. 为什么加了 -u,见此处GitHub issue。因为我们在 jira.py 中使用了 print,但是实际没有打印。

镜像大小

REPOSITORY                  TAG              IMAGE ID       CREATED         SIZE
test                        1                40a9210e6c66   2 hours ago     68.6MB
python                      3.9.2-slim       972ef8de24a4   11 months ago   114MB
gcr.io/distroless/python3   latest           92f9e40d3e5a   52 years ago    54.2MB

这里的 test:1就是我们 build 的镜像,可以看到镜像体积比直接使用 python的 slim 镜像少了不少。