
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
!https://github.com/snakepacker/python/raw/master/logo.png
本仓库提供并演示了一种将Python包打包为紧凑Docker镜像的方法,基于现代的https://releases.ubuntu.com/jammy/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E3%80%82
本项目同时在官方Docker仓库和GitHub Container Registry(ghcr.io)提供。
| https://github.com/orgs/snakepacker/repositories | https://hub.docker.com/r/snakepacker/python |
|---|---|
| https://github.com/orgs/snakepacker/packages/container/package/python%2Fall | https://hub.docker.com/r/snakepacker/python/tags?page=1&name=all |
| https://github.com/orgs/snakepacker/packages/container/package/python%2Fall-pillow | https://hub.docker.com/r/snakepacker/python/tags?page=1&name=all-pillow |
| https://github.com/orgs/snakepacker/packages/container/package/python%2F3.11 | https://hub.docker.com/r/snakepacker/python/tags?page=1&name=3.11 |
| https://github.com/orgs/snakepacker/packages/container/package/python%2F3.11-pillow | https://hub.docker.com/r/snakepacker/python/tags?page=1&name=3.11-pillow |
| https://github.com/orgs/snakepacker/packages/container/package/python%2F3.10 | https://hub.docker.com/r/snakepacker/python/tags?page=1&name=3.10 |
| https://github.com/orgs/snakepacker/packages/container/package/python%2F3.10-pillow | https://hub.docker.com/r/snakepacker/python/tags?page=1&name=3.10-pillow |
| https://github.com/orgs/snakepacker/packages/container/package/python%2F3.9 | https://hub.docker.com/r/snakepacker/python/tags?page=1&name=3.9 |
| https://github.com/orgs/snakepacker/packages/container/package/python%2F3.9-pillow | https://hub.docker.com/r/snakepacker/python/tags?page=1&name=3.9-pillow |
| https://github.com/orgs/snakepacker/packages/container/package/python%2F3.8 | https://hub.docker.com/r/snakepacker/python/tags?page=1&name=3.8 |
| https://github.com/orgs/snakepacker/packages/container/package/python%2F3.8-pillow | https://hub.docker.com/r/snakepacker/python/tags?page=1&name=3.8-pillow |
| https://github.com/orgs/snakepacker/packages/container/package/python%2F3.7 | https://hub.docker.com/r/snakepacker/python/tags?page=1&name=3.7 |
| https://github.com/orgs/snakepacker/packages/container/package/python%2F3.7-pillow | https://hub.docker.com/r/snakepacker/python/tags?page=1&name=3.7-pillow |
| https://github.com/orgs/snakepacker/packages/container/package/python%2Fpylama | https://hub.docker.com/r/snakepacker/python/tags?page=1&name=pylama |
| https://github.com/orgs/snakepacker/packages/container/package/python%2Fpylava | https://hub.docker.com/r/snakepacker/python/tags?page=1&name=pylava |
| https://github.com/orgs/snakepacker/packages/container/package/python%2Fipython | https://hub.docker.com/r/snakepacker/python/tags?page=1&name=ipython |
| https://github.com/orgs/snakepacker/packages/container/package/python%2Fcertbot | https://hub.docker.com/r/snakepacker/python/tags?page=1&name=certbot |
| https://github.com/orgs/snakepacker/packages/container/package/python%2Fblack | https://hub.docker.com/r/snakepacker/python/tags?page=1&name=black |
| https://github.com/orgs/snakepacker/packages/container/package/python%2Fgray | https://hub.docker.com/r/snakepacker/python/tags?page=1&name=gray |
| https://github.com/orgs/snakepacker/packages/container/package/python%2Fruff | https://hub.docker.com/r/snakepacker/python/tags?page=1&name=ruff |
| https://github.com/orgs/snakepacker/packages/container/package/python%2Fjupyterlab | https://hub.docker.com/r/snakepacker/python/tags?page=1&name=jupyterlab |
| https://github.com/orgs/snakepacker/packages/container/package/python%2Fbase | https://hub.docker.com/r/snakepacker/python/tags?page=1&name=base |
根据用途和特性,镜像分类如下:
| 标签 | 信息 | 用途 | 特性 |
|---|---|---|---|
| all | 构建阶段 | 包含所有可用Python版本、libpython头文件和编译器 | |
| all-pillow | 构建阶段 | 包含所有可用Python版本、libpython头文件、图形库头文件和编译器 | |
| https://docs.python.org/3/whatsnew/3.11.html | 目标阶段 | 纯Python 3.11 | |
| https://docs.python.org/3/whatsnew/3.10.html | 目标阶段 | 纯Python 3.10 | |
| https://docs.python.org/3/whatsnew/3.9.html | 目标阶段 | 纯Python 3.9 | |
| https://docs.python.org/3/whatsnew/3.8.html | 目标阶段 | 纯Python 3.8 | |
| https://docs.python.org/3/whatsnew/3.7.html | 目标阶段 | 纯Python 3.7 | |
| https://docs.python.org/3/whatsnew/3.11.html | 目标阶段 | 带图形库二进制文件的纯Python 3.11 | |
| https://docs.python.org/3/whatsnew/3.10.html | 目标阶段 | 带图形库二进制文件的纯Python 3.10 | |
| https://docs.python.org/3/whatsnew/3.9.html | 目标阶段 | 带图形库二进制文件的纯Python 3.9 | |
| https://docs.python.org/3/whatsnew/3.8.html | 目标阶段 | 带图形库二进制文件的纯Python 3.8 | |
| https://docs.python.org/3/whatsnew/3.7.html | 目标阶段 | 带图形库二进制文件的纯Python 3.7 | |
| https://pylama.readthedocs.io/en/latest/ | 即用型 | pylama应用镜像(适用于CI) | |
| https://pylavadocs.readthedocs.io/en/latest/ | 即用型 | pylava应用镜像(适用于CI) | |
| https://jupyter.org | 即用型 | ipython应用镜像 | |
| https://certbot.eff.org | 即用型 | certbot应用镜像 | |
| https://black.readthedocs.io/en/stable/ | 即用型 | black应用镜像(适用于CI) | |
| https://github.com/dizballanze/gray | 即用型 | gray应用镜像(适用于CI) | |
| https://github.com/astral-sh/ruff | 即用型 | ruff linter镜像(适用于CI) | |
| https://github.com/jupyterlab/jupyterlab | 即用型 | jupyterlab镜像 | |
| base | 公共层 |
该方法的核心思想是:使用功能齐全的重型镜像(如ghcr.io/snakepacker/python:all,包含所有必要的头文件、库、编译器等)为你的包构建virtualenv,然后将其复制到具有合适Python版本的轻量级基础镜像中。
为何需要如此复杂的流程?你可能会认为直接将Python项目目录COPY到Docker容器中更简单,乍一看似乎合理,但直接复制会导致以下问题:
在不同操作系统上生成的.pyc文件可能会意外打包到Docker镜像中,导致Python每次启动镜像时尝试重写正确的.pyc文件。如果以只读模式运行镜像,应用会崩溃。
很可能会打包垃圾文件:pytest和tox缓存、开发者的virtualenv等,这些文件只会增加最终镜像的大小。
缺少明确的入口点。最终用户难以确定可以运行哪些命令(尽管你可能实现了-h或--help参数)。
默认情况下,tox将你的包解释为Python模块,例如在准备环境时尝试运行pip install .。
当然,你可以通过hack、特定设置、.dockerignore文件等解决这些问题,但这对用户来说不直观且难以理解。因此,建议花少量时间仔细打包你的包,让用户能够愉快地使用。
例如,你可以构建jupyter notebook。只需创建包含以下内容的Dockerfile:
Dockerfile################################################################# ####################### 构建阶段 ############################# ################################################################# # 该镜像包含: # 1. 所有Python版本 # 2. 所需的Python头文件 # 3. C编译器和开发工具 FROM ***-ghcr.xuanyuan.run/snakepacker/python:all as builder # 在Python 3.10上创建virtualenv # 目标文件夹在构建阶段和目标阶段应保持一致 RUN python3.10 -m venv /usr/share/python3/app # 安装目标包 RUN /usr/share/python3/app/bin/pip install -U pip 'ipython[notebook]' # 查找所需的系统库及其包 RUN find-libdeps /usr/share/python3/app > /usr/share/python3/app/pkgdeps.txt ################################################################# ####################### 目标阶段 ############################ ################################################################# # 使用与构建阶段相同版本的镜像 FROM ***-ghcr.xuanyuan.run/snakepacker/python:3.10 # 将virtualenv复制到目标镜像 COPY --from=builder /usr/share/python3/app /usr/share/python3/app # 安装所需的库包 RUN xargs -ra /usr/share/python3/app/pkgdeps.txt apt-install # 创建指向目标二进制文件的符号链接(仅为方便) RUN ln -snf /usr/share/python3/app/bin/ipython /usr/bin/ CMD ["ipython"]
然后构建镜像:
bashdocker build -t ipython .
所有镜像都包含易于使用的包装器,便于镜像构建。
简单的bash脚本,主要用途是在通过apt-get install安装软件后自动清理apt缓存和临时文件。通常你需要编写:
bashapt-get update && \ apt-get install -y tcpdump && \ rm -fr /var/lib/apt/lists /var/lib/cache/* /var/log/*
使用apt-install可简化为:
bashapt-install tcpdump
等待一个或多个TCP端口可用的Python脚本,非常适用于测试和docker-compose环境。
bashwait-for-port --period=0.5 --timeout=600 postgres:5432 pgbouncer:6432 && python myscript.py
或更简洁的写法(使用上述示例中的默认值):
bashwait-for-port postgres:5432 pgbouncer:6432 && python myscript.py
该脚本会尝试连接指定的端点,直到超时或端点可连接为止。
查找二进制*.so文件并解析所需系统包以安装库依赖的shell脚本。
保存所需包:
bashfind-libdeps /usr
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务
以下是 snakepacker/python 相关的常用 Docker 镜像,适用于 Web 开发、数据科学、机器学习 等不同场景: