网易首页 > 网易号 > 正文 申请入驻

如何用 Docker 构建企业级 PyPi 服务?

0
分享至

剧照:怒火·重案

作者:岛哥

来源:岛哥的质量效能笔记

背景

我们平常使用 pip 命令安装 Python 包时,默认是去 https://pypi.python.org/simple/ 源查找相应的包下载并安装的,但是在企业内网环境我们需要发布一些私有包提供给内部用户使用时,就需要搭建自己的 PyPI Server了。

PyPI Server 方案对比

下面是目前已知的一些部署私有仓库服务的方案

框架 代理镜像 本地缓存
搜索
devpi Y
Y
支持 Web + XML RPC
DjangoPyPI Y N 支持 Web + XML RPC chishop N N 不支持 pypiserver Y N 不支持 Cheese Shop N N 支持 Web + XML RPC localshop Y Y 只支持 XML RPC mypypi N N 不支持 proxypypi Y Y 不支持 Flask-Pypi-Proxy Y Y 不支持

介绍

devpi有一些特有的功能:

  • 支持本地缓存,可以做到公司内网加速的效果

  • 支持Sphinx文档

  • 提供多索引支持,多索引之间还可以继承,这在维护多版本系统上非常有用

  • 支持集群部署,支持一台或多台服务器部署实现访问加速

  • 支持通过 json 接口,实时监控集群的状态

  • 支持导入导出功能

  • 支持给索引设置 Jenkins 触发器,可以使用 tox 自动测试上传的包

  • 使用插件可以完成Web界面的访问控制,增加私有包的安全

容器化部署

这里介绍一下用容器的方式如何部署,首先我们这个容器中包括三个组件:

  • devpi-server 属于核心组件,提供镜像与缓存功能

  • devpi-web 提供Web界面和查询功能

  • devpi-lockdown 通过在nginx的帮助下实现对Web界面添加访问控制的功能

Dockerfile


FROM suadminwen/python3-ubuntu:latest
WORKDIR /root/
RUN pip install supervisorRUN mkdir /devpiRUN pip install devpi-server devpi-web devpi-lockdown \&& devpi-init \&& devpi-gen-config --host 0.0.0.0 --port 3141
RUN apt update \&& apt install nginx -y
COPY ./nginx-devpi.conf /etc/nginx/sites-enabled/defaultCOPY ./run.sh /root/
EXPOSE 31415EXPOSE 80ENTRYPOINT ["bash", "run.sh"]

nginx-devpi.conf


server {server_name 0.0.0.0;listen 80;gzip on;gzip_min_length 2000;gzip_proxied any;gzip_types application/json;
proxy_read_timeout 60s;client_max_body_size 64M;
# set to where your devpi-server state is on the filesystemroot /root/.devpi/server;
# this redirects to the login view when not logged inrecursive_error_pages on;error_page 401 = @error401;location @error401 {return 302 /+login;
# lock down everything by defaultauth_request /+authcheck;
location = /+login {auth_request off;proxy_set_header X-outside-url $scheme://$http_host;proxy_pass http://localhost:3141;
location ~ /\+api$ {auth_request off;proxy_set_header X-outside-url $scheme://$http_host;proxy_pass http://localhost:3141;
# try serving static files directlylocation ~ /\+f/ {auth_request off;# workaround to pass non-GET/HEAD requests through to the named location belowerror_page 418 = @proxy_to_app;if ($request_method !~ (GET)|(HEAD)) {return 418;
expires max;try_files /+files$uri @proxy_to_app;# try serving docs directlylocation ~ /\+doc/ {auth_request off;# if the --documentation-path option of devpi-web is used,# then the root must be set accordingly hereroot /root/.devpi/server;try_files $uri @proxy_to_app;location / {# workaround to pass all requests to / through to the named location belowerror_page 418 = @proxy_to_app;return 418;location @proxy_to_app {proxy_pass http://localhost:3141;proxy_set_header X-outside-url $scheme://$http_host;proxy_set_header X-Real-IP $remote_addr;
location = /+authcheck {internal;proxy_pass_request_body off;proxy_set_header Content-Length "";proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-outside-url $scheme://$http_host;proxy_pass http://localhost:3141;

run.sh


echo -e 'start supervisord'/usr/local/bin/supervisord -c /root/gen-config/supervisord.conf
echo -e 'start nginx'nginx -g 'daemon off;'

docker-compose.yml


services:devpiserver:container_name: devpiserverbuild:context: .ports:- 80:80- 31415:80volumes:- ~/.devpi:/root/.devpi

在准备好上述文件后,先在用户根目录执行下面的命令:


pip install devpi-serverdevpi init

然后在docker文件根目录执行下面的命令即可完成服务的启动:


docker-compose up -d

使用

安装依赖

本地的操作是需要使用devpi-client来完成的,执行下面的命令安装依赖:


pip install -U devpi-client

创建连接


devpi use http://devpi.xxxxx.com/

用户管理

默认的用户是root,密码是空


# 使用root账号登录devpi login root --password=# 修改root用户密码为qwedevpi user -m root password=qwe# 创建新用户dev并设定密码为qwedevpi user -c dev password=qwe# 新用户登录devpi login dev --password=qwe# 退出登录devpi logoff

索引管理

登录之后才可以进行索引操作


# 创建dev索引devpi index -c dev bases=root/pypi# 使用dev索引devpi use root/dev
# 当仓库中不存在包时,从豆瓣下载包缓存到本地(默认是从官方源 https://pypi.python.org/simple/ 下载)devpi index root/dev mirror_url = “https://pypi.doubanio.com/simple/"# devpi push 命令是将包从一个索引推送到另外一个索引,例如将包example推送到root/devdevpi push example==1.0 root/dev

上传私有包

上传包使用的是 devpi upload 命令,需要在 setup.py 文件所在目录下执行,这个命令有两个常用的参数:

  • --with-docs 参数,连带docs文件一块上传,支持 sphinx 创建的文档

  • --formats bdist_wheel 参数,上传wheel格式的包,需要安装wheel库, pip install wheel


devpi use http://pypi-xx.com/devpi login root --password=qwedevpi use root/devdevpi upload --formats bdist_wheeldevpi upload --with-docsdevpi upload

删除私有包


devpi remove exampledevpi remove example>=1.0.1

下载私有包

无访问限制:


pip install -i "http://[host]/root/dev/+simple/" [package] --trusted-host [host]

有访问限制:


pip install -i "http://[user]:[password]@[host]/root/dev/+simple/" [package] --trusted-host [host]

本地环境配置

无访问限制:


[global]timeout = 60index-url = http://pypi-xx.com/root/dev/+simple/[install]trusted-host = pypi-xx.com

有访问限制:


[global]timeout = 60index-url = http://[user]:[password]@[host]/root/dev/+simple/[install]trusted-host = pypi-xx.com

devpi服务器迁移

如果想要前移服务器的文件,首先需要找到devpi服务器数据所在地址,进入server目录中找到 '+ files' 目录拷贝出来,然后使用下面命令把已有的私有包导入新的服务中:


devpi upload --from-dir '+files'

效果图

还不过瘾?试试它们

如果你觉得本文有帮助

请慷慨分享点赞,感谢啦

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
抓了16个乌军一审,俄军当场傻了:真正按发射键的根本不在乌克兰

抓了16个乌军一审,俄军当场傻了:真正按发射键的根本不在乌克兰

扬子的故事屋
2026-06-30 10:36:41
北京这一夜,黄晓明做法让人大跌眼镜,分手原因曝光,杨颖买了单

北京这一夜,黄晓明做法让人大跌眼镜,分手原因曝光,杨颖买了单

全球风情大揭秘
2026-07-02 03:29:24
曼联哭晕!头号水货世界杯现形!英格兰险些被他坑惨了

曼联哭晕!头号水货世界杯现形!英格兰险些被他坑惨了

奶盖熊本熊
2026-07-02 02:15:04
和知名导演同居3年,转身找普通人“接盘”,如今52岁就戴老花镜

和知名导演同居3年,转身找普通人“接盘”,如今52岁就戴老花镜

翰飞观事
2026-07-01 17:01:16
当年揭露“三鹿奶粉”的上海记者,4年后辞职,17年后变成这样了

当年揭露“三鹿奶粉”的上海记者,4年后辞职,17年后变成这样了

轩逸阿II
2026-07-02 00:18:01
金价真的是一夜变天,7月1日新报价,全国金价竟然差这么多?

金价真的是一夜变天,7月1日新报价,全国金价竟然差这么多?

次元君情感
2026-07-01 14:28:08
余承东硬刚马斯克:特斯拉FSD只是接近,我们是超越!

余承东硬刚马斯克:特斯拉FSD只是接近,我们是超越!

大厂财经社
2026-07-01 11:31:01
埃尔多安呼吁摧毁以色列,兵力相差26万,内塔尼亚胡不敢轻举妄动

埃尔多安呼吁摧毁以色列,兵力相差26万,内塔尼亚胡不敢轻举妄动

离离言几许
2026-07-02 02:20:00
特朗普持仓曝光!赚麻了。。

特朗普持仓曝光!赚麻了。。

格隆汇
2026-07-01 17:42:08
1-2!太火爆了!双响再次出现,2大历史纪录刷新,非洲又一队淘汰

1-2!太火爆了!双响再次出现,2大历史纪录刷新,非洲又一队淘汰

小徐讲八卦
2026-07-02 05:29:26
韩国球迷怒骂滚出去!洪明甫被护送出境,入境大厅仅停留 2 分钟

韩国球迷怒骂滚出去!洪明甫被护送出境,入境大厅仅停留 2 分钟

老黯谈娱
2026-07-02 01:53:08
《四渡》里3万红军对抗40万敌军,电影外人民群众对抗黑分子

《四渡》里3万红军对抗40万敌军,电影外人民群众对抗黑分子

光影新天地
2026-06-29 12:50:20
和王楚钦秘密结婚真相大白后,孙颖莎近况曝光,难怪被踢出大赛

和王楚钦秘密结婚真相大白后,孙颖莎近况曝光,难怪被踢出大赛

徐醇老表哥
2026-07-02 04:10:10
先进封装迈向玻璃基板时代,国内面板巨头跑步入场,谁有望成为赢家?

先进封装迈向玻璃基板时代,国内面板巨头跑步入场,谁有望成为赢家?

华尔街见闻官方
2026-07-01 15:19:49
湖人队昆廷·格莱姆斯与父亲的合影,仿佛注定他将成为湖人一员

湖人队昆廷·格莱姆斯与父亲的合影,仿佛注定他将成为湖人一员

好火子
2026-07-02 05:44:49
欠税39.5元!美妆博主程十安停更三年回归涨粉

欠税39.5元!美妆博主程十安停更三年回归涨粉

情感大头说说
2026-07-01 15:45:39
俄军继续推进,普京最新表态!打了4年多,双方伤亡近180万人,乌人口锐减900万!特朗普:与美国无关,“只是卖卖武器”

俄军继续推进,普京最新表态!打了4年多,双方伤亡近180万人,乌人口锐减900万!特朗普:与美国无关,“只是卖卖武器”

鲁中晨报
2026-06-29 14:39:03
镰田大地:除非足球成为日本的国球,否则很难拿下世界杯冠军

镰田大地:除非足球成为日本的国球,否则很难拿下世界杯冠军

懂球帝
2026-07-01 16:20:23
立刻删掉自选股蹭概念!长鑫10个拿实单硬核厂商

立刻删掉自选股蹭概念!长鑫10个拿实单硬核厂商

流苏晚晴
2026-07-01 18:08:14
历史第一人!哈兰德一己之力改写挪威28年世界杯空白,缔造传奇

历史第一人!哈兰德一己之力改写挪威28年世界杯空白,缔造传奇

夜白侃球
2026-07-01 11:29:58
2026-07-02 06:15:00
Python猫 incentive-icons
Python猫
人生苦短,我用Python。博客:https://pythoncat.top
732文章数 8120关注度
往期回顾 全部

科技要闻

Claude Code被曝“植入木马”识别中国用户

头条要闻

凯恩梅开二度 英格兰2-1逆转民主刚果将战墨西哥

头条要闻

凯恩梅开二度 英格兰2-1逆转民主刚果将战墨西哥

体育要闻

卖球衣救子的门将,把德国扑出了世界杯

娱乐要闻

77岁牛群公证裸捐全部财产,清贫独居坚持月捐

财经要闻

新氧贷款:宣传年化15%,实际顶格24%

汽车要闻

同比暴涨188.4% 方程豹6月热销35607台

态度原创

亲子
本地
艺术
教育
健康

亲子要闻

兰姐出差回北京,先去看小裙子!和小宝宝戴同款墨镜超开心!

本地新闻

强烈建议,全国高校都向这所大学看齐!

艺术要闻

宋朝:生活品味,比权力和财富更重要!

教育要闻

2026年高考地理广东卷“十宗罪”

年糕汤圆别油炸,水煮清蒸更健康

无障碍浏览 进入关怀版