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"]
这里有几个注意点
- 最开始 Python的版本为什么是3.9.2?因为我们最后运行的Python的版本是3.9.2
- 注意这里使用了两阶段 build,至于为什么使用 distroless的镜像,请参考Google distroless image
- 为什么是把 site-packages移动走,是收到了此博文的启发
- 为什么加了 -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 镜像少了不少。