利用Docker快速构建基于devpi的企业级私有PyPI Server

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

PyPI Server 方案对比


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


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

介绍


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 supervisor
RUN mkdir /devpi
RUN 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/default
COPY ./run.sh /root/
EXPOSE 31415
EXPOSE 80
ENTRYPOINT ["bash", "run.sh"]

nginx-devpi.conf

erver {
    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 filesystem
    root /root/.devpi/server;
    # this redirects to the login view when not logged in
    recursive_error_pages on;
    error_page 401 = @error401;
    location @error401 {
        return 302 /+login;
    }
    # lock down everything by default
    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;
    }
    # try serving static files directly
    location ~ /\+f/ {
        auth_request off;
        # workaround to pass non-GET/HEAD requests through to the named location below
        error_page 418 = @proxy_to_app;
        if ($request_method !~ (GET)|(HEAD)) {
            return 418;
        }
        expires max;
        try_files /+files$uri @proxy_to_app;
    }
    # try serving docs directly
    location ~ /\+doc/ {
        auth_request off;
    # if the --documentation-path option of devpi-web is used,
    # then the root must be set accordingly here
    root /root/.devpi/server;
    try_files $uri @proxy_to_app;
            }
  location / {
    # workaround to pass all requests to / through to the named location below
    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文件根目录执行下面的命令即可完成服务的启动:

docker-compose up -d


使用


安装依赖

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

pip install -U devpi-client

创建连接

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

用户管理

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

# 使用root账号登录
devpi login root --password=
# 修改root用户密码为qwe
devpi user -m root password=qwe 
# 创建新用户dev并设定密码为qwe
devpi 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/dev
devpi 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_wheel
devpi upload --with-docs
devpi upload

删除私有包


devpi remove example
devpi 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'


效果图


image.png

image.png

相关文章
|
1月前
|
运维 Kubernetes Docker
利用Docker和Kubernetes构建微服务架构
利用Docker和Kubernetes构建微服务架构
|
3天前
|
NoSQL Java Linux
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
123 75
|
3月前
|
负载均衡 网络协议 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基本概念和类型,包括桥接网络、宿主网络、覆盖网络和 Macvlan 网络等,并提供了创建、管理和配置自定义网络的实用命令。通过掌握这些知识,开发者可以构建更健壮和灵活的容器化应用,提高应用的可扩展性和安全性。
|
25天前
|
数据库 Docker 容器
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。Dockerfile定义了构建镜像所需的所有指令,包括基础镜像选择、软件安装、文件复制等,极大提高了开发和部署的灵活性与一致性。掌握Dockerfile的编写,对于提升软件开发效率和环境管理具有重要意义。
48 9
|
1月前
|
机器学习/深度学习 数据采集 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用
|
1月前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
161 2
|
2月前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
本文介绍了Docker和Kubernetes在构建高效微服务架构中的应用,涵盖基本概念、在微服务架构中的作用及其实现方法。通过具体实例,如用户服务、商品服务和订单服务,展示了如何利用Docker和Kubernetes实现服务的打包、部署、扩展及管理,确保微服务架构的稳定性和可靠性。
106 7
|
1月前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【10月更文挑战第22天】随着云计算和容器技术的快速发展,微服务架构逐渐成为现代企业级应用的首选架构。微服务架构将一个大型应用程序拆分为多个小型、独立的服务,每个服务负责完成一个特定的功能。这种架构具有灵活性、可扩展性和易于维护的特点。在构建微服务架构时,Docker和Kubernetes是两个不可或缺的工具,它们可以完美搭档,为微服务架构提供高效的支持。本文将从三个方面探讨Docker和Kubernetes在构建高效微服务架构中的应用:一是Docker和Kubernetes的基本概念;二是它们在微服务架构中的作用;三是通过实例讲解如何使用Docker和Kubernetes构建微服务架构。
67 6
|
1月前
|
负载均衡 应用服务中间件 nginx
基于Nginx和Consul构建自动发现的Docker服务架构——非常之详细
通过使用Nginx和Consul构建自动发现的Docker服务架构,可以显著提高服务的可用性、扩展性和管理效率。Consul实现了服务的自动注册与发现,而Nginx则通过动态配置实现了高效的反向代理与负载均衡。这种架构非常适合需要高可用性和弹性扩展的分布式系统。
37 4
|
1月前
|
负载均衡 应用服务中间件 nginx
基于Nginx和Consul构建自动发现的Docker服务架构——非常之详细
通过使用Nginx和Consul构建自动发现的Docker服务架构,可以显著提高服务的可用性、扩展性和管理效率。Consul实现了服务的自动注册与发现,而Nginx则通过动态配置实现了高效的反向代理与负载均衡。这种架构非常适合需要高可用性和弹性扩展的分布式系统。
55 3

热门文章

最新文章