本站支持搜索的镜像仓库:Docker Hub、gcr.io、ghcr.io、quay.io、k8s.gcr.io、registry.gcr.io、elastic.co、mcr.microsoft.com

!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:
################################################################# ####################### 构建阶段 ############################# ################################################################# # 该镜像包含: # 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"]
然后构建镜像:
docker build -t ipython .
所有镜像都包含易于使用的包装器,便于镜像构建。
简单的bash脚本,主要用途是在通过apt-get install安装软件后自动清理apt缓存和临时文件。通常你需要编写:
apt-get update && \ apt-get install -y tcpdump && \ rm -fr /var/lib/apt/lists /var/lib/cache/* /var/log/*
使用apt-install可简化为:
apt-install tcpdump
等待一个或多个TCP端口可用的Python脚本,非常适用于测试和docker-compose环境。
wait-for-port --period=0.5 --timeout=600 postgres:5432 pgbouncer:6432 && python myscript.py
或更简洁的写法(使用上述示例中的默认值):
wait-for-port postgres:5432 pgbouncer:6432 && python myscript.py
该脚本会尝试连接指定的端点,直到超时或端点可连接为止。
查找二进制*.so文件并解析所需系统包以安装库依赖的shell脚本。
保存所需包:
find-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 登录方式配置轩辕镜像加速服务,包含7个详细步骤
在 Linux 系统上配置轩辕镜像源,支持主流发行版
在 Docker Desktop 中配置轩辕镜像加速,适用于桌面系统
在 Docker Compose 中使用轩辕镜像加速,支持容器编排
在 k8s 中配置 containerd 使用轩辕镜像加速
在宝塔面板中配置轩辕镜像加速,提升服务器管理效率
在 Synology 群晖NAS系统中配置轩辕镜像加速
在飞牛fnOS系统中配置轩辕镜像加速
在极空间NAS中配置轩辕镜像加速
在爱快ikuai系统中配置轩辕镜像加速
在绿联NAS系统中配置轩辕镜像加速
在威联通NAS系统中配置轩辕镜像加速
在 Podman 中配置轩辕镜像加速,支持多系统
配置轩辕镜像加速9大主流镜像仓库,包含详细配置步骤
无需登录即可使用轩辕镜像加速服务,更加便捷高效
需要其他帮助?请查看我们的 常见问题 或 官方QQ群: 13763429