!logo
本仓库提供并演示了一种将Python包打包为紧凑Docker镜像的方法,基于现代的Ubuntu Jammy操作系统。
本项目同时在***Docker仓库和GitHub Container Registry(ghcr.io)提供。
ghcr.io | docker.io |
|---|---|
ghcr.io/snakepacker/python/all | snakepacker/python:all |
ghcr.io/snakepacker/python/all-pillow | snakepacker/python:all-pillow |
ghcr.io/snakepacker/python/3.11 | snakepacker/python:3.11 |
ghcr.io/snakepacker/python/3.11-pillow | snakepacker/python:3.11-pillow |
ghcr.io/snakepacker/python/3.10 | snakepacker/python:3.10 |
ghcr.io/snakepacker/python/3.10-pillow | snakepacker/python:3.10-pillow |
ghcr.io/snakepacker/python/3.9 | snakepacker/python:3.9 |
ghcr.io/snakepacker/python/3.9-pillow | snakepacker/python:3.9-pillow |
ghcr.io/snakepacker/python/3.8 | snakepacker/python:3.8 |
ghcr.io/snakepacker/python/3.8-pillow | snakepacker/python:3.8-pillow |
ghcr.io/snakepacker/python/3.7 | snakepacker/python:3.7 |
ghcr.io/snakepacker/python/3.7-pillow | snakepacker/python:3.7-pillow |
ghcr.io/snakepacker/python/pylama | snakepacker/python:pylama |
ghcr.io/snakepacker/python/pylava | snakepacker/python:pylava |
ghcr.io/snakepacker/python/ipython | snakepacker/python:ipython |
ghcr.io/snakepacker/python/certbot | snakepacker/python:certbot |
ghcr.io/snakepacker/python/black | snakepacker/python:black |
ghcr.io/snakepacker/python/gray | snakepacker/python:gray |
ghcr.io/snakepacker/python/ruff | snakepacker/python:ruff |
ghcr.io/snakepacker/python/jupyterlab | snakepacker/python:jupyterlab |
ghcr.io/snakepacker/python/base | snakepacker/python:base |
根据用途和特性,镜像分类如下:
| 标签 | 信息 | 用途 | 特性 |
|---|---|---|---|
| all |  |
| pylava |  |
| ipython |  |
| gray |  |
| ruff |  |
| 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

来自真实用户的反馈,见证轩辕镜像的优质服务
免费版仅支持 Docker Hub 加速,不承诺可用性和速度;专业版支持更多镜像源,保证可用性和稳定速度,提供优先客服响应。
免费版仅支持 docker.io;专业版支持 docker.io、gcr.io、ghcr.io、registry.k8s.io、nvcr.io、quay.io、mcr.microsoft.com、docker.elastic.co 等。
当返回 402 Payment Required 错误时,表示流量已耗尽,需要充值流量包以恢复服务。
通常由 Docker 版本过低导致,需要升级到 20.x 或更高版本以支持 V2 协议。
先检查 Docker 版本,版本过低则升级;版本正常则验证镜像信息是否正确。
使用 docker tag 命令为镜像打上新标签,去掉域名前缀,使镜像名称更简洁。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
在 Linux 系统配置镜像加速服务
在 Docker Desktop 配置镜像加速
Docker Compose 项目配置加速
Kubernetes 集群配置 Containerd
在宝塔面板一键配置镜像加速
Synology 群晖 NAS 配置加速
飞牛 fnOS 系统配置镜像加速
极空间 NAS 系统配置加速服务
爱快 iKuai 路由系统配置加速
绿联 NAS 系统配置镜像加速
QNAP 威联通 NAS 配置加速
Podman 容器引擎配置加速
HPC 科学计算容器配置加速
ghcr、Quay、nvcr 等镜像仓库
无需登录使用专属域名加速
需要其他帮助?请查看我们的 常见问题 或 官方QQ群: 13763429