
!https://github.com/snakepacker/python/raw/master/logo.png
本仓库提供并演示了一种将Python包打包为紧凑Docker镜像的方法,基于现代的Ubuntu Jammy操作系统。
本项目同时在官方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 |  |
| pylava |  |
| ipython |  |
| https://github.com/dizballanze/gray |  |
| https://github.com/astral-sh/ruff |  |
| https://github.com/jupyterlab/jupyterlab | 为你的包构建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.io/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.io/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 开发、数据科学、机器学习 等不同场景:
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。

探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务