
剧照:怒火·重案
作者:岛哥
来源:岛哥的质量效能笔记
我们平常使用 pip 命令安装 Python 包时,默认是去 https://pypi.python.org/simple/ 源查找相应的包下载并安装的,但是在企业内网环境我们需要发布一些私有包提供给内部用户使用时,就需要搭建自己的 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有一些特有的功能:
这里介绍一下用容器的方式如何部署,首先我们这个容器中包括三个组件:
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 80 ENTRYPOINT ["bash", "run.sh"]
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;
root /root/.devpi/server;
recursive_error_pages on; error_page 401 = @error401; location @error401 { return 302 /+login; }
auth_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; }
location ~ /\+f/ { auth_request off; error_page 418 = @proxy_to_app; if ($request_method !~ (GET)|(HEAD)) { return 418; }
expires max; try_files /+files$uri @proxy_to_app; } location ~ /\+doc/ { auth_request off; root /root/.devpi/server; try_files $uri @proxy_to_app; } location / { error_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: devpiserver build: context: . ports: - 80:80 - 31415:80 volumes: - ~/.devpi:/root/.devpi
在准备好上述文件后,先在用户根目录执行下面的命令:
pip install devpi-serverdevpi init
然后在docker文件根目录执行下面的命令即可完成服务的启动:
本地的操作是需要使用devpi-client来完成的,执行下面的命令安装依赖:
pip install -U devpi-client
创建连接
devpi use http://devpi.xxxxx.com/
默认的用户是root,密码是空
devpi login root --password=devpi user -m root password=qwe devpi user -c dev password=qwedevpi login dev --password=qwedevpi logoff
登录之后才可以进行索引操作
devpi index -c dev bases=root/pypidevpi use root/dev
devpi index root/dev mirror_url = “https://pypi.doubanio.com/simple/"devpi push example==1.0 root/dev
上传包使用的是 devpi upload 命令,需要在 setup.py 文件所在目录下执行,这个命令有两个常用的参数:
devpi use http://pypi-xx.com/devpi login root devpi use root/devdevpi upload devpi upload devpi upload
删除私有包
devpi remove exampledevpi remove example>=1.0.1
无访问限制:
pip install -i "http://[host]/root/dev/+simple/" [package]
有访问限制:
pip install -i "http://[user]:[password]@[host]/root/dev/+simple/" [package]
无访问限制:
[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服务器数据所在地址,进入server目录中找到 '+ files' 目录拷贝出来,然后使用下面命令把已有的私有包导入新的服务中:
devpi upload --from-dir '+files'


Python猫技术交流群开放啦!群里既有国内一二线大厂在职员工,也有国内外高校在读学生,既有十多年码龄的编程老鸟,也有中小学刚刚入门的新人,学习氛围良好!想入群的同学,请在公号内回复『交流群』,获取猫哥的微信(谢绝广告党,非诚勿扰!)~