搭建pypi本地私有仓库之二(docker-compose方式)
windows 搭建私有PyPI仓库之三(本地)
https://www.cnblogs.com/aozhejin/p/19265959
https://www.cnblogs.com/aozhejin/p/19265738
pypiserver 是一个极简的 PyPI 兼容服务器,支持 pip 或 easy_install。 提供来自常规目录的package。 whl、bdists、eggs及相关PGP签名都可以上传 无论是用PIP、setuptools、Twine、pypi-uploader,还是直接复制 与SCP合作。windows下支持不并不好,如果你通过 pip install pypi 下载、命令行启动pypi会比较麻烦,所以下面
利用 docker-compose 安装pypi server
这种方式比较简单,但是需要你提前安装docker,目前机器上安装有docker desktop 环境,所以docker环境具备
1、我们只需要创建docker-compose.yml
version: '3.7' services: pypi-server: image: pypiserver/pypiserver:latest #镜像将从docker hub上下载 ports: - 8080:8080 #访问端口号 即http://域名:端口号 volumes: - type: volume source: pypi-server target: /data/packages #python包放置的目录 command: -P . -a . /data/packages restart: always volumes: pypi-server:
2.进入cmd命令行,执行
D:\pypi>docker-compose up -d --build time="2025-11-22T20:44:30+08:00" level=warning msg="D:\\pypi\\docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion" [+] Running 11/11 ✔ pypi-server Pulled 15.8s ✔ c9ebb165a315 Pull complete 0.8s ✔ f03511615e47 Pull complete 9.4s ✔ 2665be2baf2b Pull complete 0.4s ✔ ccf84ef69d96 Pull complete 1.8s ✔ 8534c94cd38e Pull complete 1.7s ✔ 3dff85a7126f Pull complete 9.2s ✔ 0a9a5dfd008f Pull complete 2.9s ✔ 645dc30e2c53 Pull complete 3.3s ✔ 05784fda19ca Pull complete 9.3s ✔ 460b78d5e9c6 Pull complete 7.9s [+] Running 3/3 ✔ Network pypi_default Created 0.3s ✔ Volume pypi_pypi-server Created 0.0s ✔ Container pypi-pypi-server-1 Started 1.4s
3.查看docker desktop

4. 打开浏览器 http://localhost:8080

5.创建要上传的项目mypackage
6.编写setup.py
from setuptools import setup, find_packages setup( name = 'mypackage', #应用名 py_modules=['mypackage'], author = 'aozhejin',#作者 version = '1.0', #版本号 description="这是一个测试模块", author_email="aozhejin@163.com", packages = find_packages(), #包括在安装包内的Python包 include_package_data = True, #启用清单文件MANIFEST.in,包含数据文件 #排除文件 exclude_package_data = {'docs':['mypackage.txt']}, #自动安装依赖 install_requires = [ 'Flask>=0.10', ], )
建立mypackge子目录,包括 getfuncmoule 子目录,以及__init_.py myfunc.py 等 这些实际都很简单,这里就忽略了。 我之前文章里面有
项目结构如下:

7.进行tar.gz打包,生成分发包
PS C:\Users\king\PycharmProjects\PythonProject\mypackage> python setup.py sdist running sdist running egg_info creating mypackage.egg-info writing mypackage.egg-info\PKG-INFO writing dependency_links to mypackage.egg-info\dependency_links.txt writing requirements to mypackage.egg-info\requires.txt writing top-level names to mypackage.egg-info\top_level.txt writing manifest file 'mypackage.egg-info\SOURCES.txt' file mypackage.py (for module mypackage) not found reading manifest file 'mypackage.egg-info\SOURCES.txt' writing manifest file 'mypackage.egg-info\SOURCES.txt' warning: sdist: standard file not found: should have one of README, README.rst, README.txt, README.md running check creating mypackage-1.0 creating mypackage-1.0\mypackage creating mypackage-1.0\mypackage.egg-info creating mypackage-1.0\mypackage\getfuncmodule copying files to mypackage-1.0... copying setup.py -> mypackage-1.0 copying mypackage\__init__.py -> mypackage-1.0\mypackage copying mypackage\myfunc.py -> mypackage-1.0\mypackage copying mypackage.egg-info\PKG-INFO -> mypackage-1.0\mypackage.egg-info copying mypackage.egg-info\SOURCES.txt -> mypackage-1.0\mypackage.egg-info copying mypackage.egg-info\dependency_links.txt -> mypackage-1.0\mypackage.egg-info copying mypackage.egg-info\requires.txt -> mypackage-1.0\mypackage.egg-info copying mypackage.egg-info\top_level.txt -> mypackage-1.0\mypackage.egg-info copying mypackage\getfuncmodule\__init__.py -> mypackage-1.0\mypackage\getfuncmodule copying mypackage\getfuncmodule\subtraction.py -> mypackage-1.0\mypackage\getfuncmodule copying mypackage.egg-info\SOURCES.txt -> mypackage-1.0\mypackage.egg-info Writing mypackage-1.0\setup.cfg creating dist Creating tar archive .....
查看生成的
PS C:\Users\king\PycharmProjects\PythonProject\mypackage> tree /f 卷 Windows 的文件夹 PATH 列表 卷序列号为 F023-2216 C:. │ setup.py │ ├─dist │ mypackage-1.0.tar.gz │ ├─mypackage │ │ myfunc.py │ │ __init__.py │ │ │ ├─getfuncmodule │ │ subtraction.py │ │ __init__.py │ │ │ └─__pycache__ │ myfunc.cpython-314.pyc │ __init__.cpython-314.pyc │ ├─mypackage-1.0 │ │ PKG-INFO │ │ setup.cfg │ │ setup.py │ │ │ ├─mypackage │ │ │ myfunc.py │ │ │ __init__.py │ │ │ │ │ └─getfuncmodule │ │ subtraction.py │ │ __init__.py │ │ │ └─mypackage.egg-info │ dependency_links.txt │ PKG-INFO │ requires.txt │ SOURCES.txt │ top_level.txt │ └─mypackage.egg-info dependency_links.txt PKG-INFO requires.txt SOURCES.txt top_level.txt
8.把tar.gz包,复制到 容器内的/data/packages里面
语法为:
docker cp 容器id/容器名:容器内目录 宿主机目录
docker cp 本地文件路径 容器ID/容器NAME:容器内目录
C:\Users\king>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d0ea0dec97a8 pypiserver/pypiserver:latest "/entrypoint.sh -P .…" 46 minutes ago Up 46 minutes 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp pypi-pypi-server-1
C:\Users\king\PycharmProjects\PythonProject\mypackage> docker cp ./dist/mypackage-1.0.tar.gz d0ea0dec97a8:/data/packages Successfully copied 2.05kB to d0ea0dec97a8:/data/packages
9.浏览仓库 ,我们已经可以看到上传的包

我们再上传一个 standard_cgi-3.13.0.tar.gz 包(cgi官方包,手工下载)

10.拉取仓库包进行安装
注意: 拉取的时候 地址形式为 http://域名:端口号/packages/包名
C:\Users\king>pip install http://localhost:8080/packages/standard_cgi-3.13.0.tar.gz Collecting http://localhost:8080/packages/standard_cgi-3.13.0.tar.gz Downloading http://localhost:8080/packages/standard_cgi-3.13.0.tar.gz (17 kB) Installing build dependencies ... done Getting requirements to build wheel ... done Preparing metadata (pyproject.toml) ... done Building wheels for collected packages: standard-cgi Building wheel for standard-cgi (pyproject.toml) ... done Created wheel for standard-cgi: filename=standard_cgi-3.13.0-py3-none-any.whl size=12810 sha256=5d38b54218118a9d019419aaf3e188896adf1fb59fdc5abe5b9e92a70580fbe1 Stored in directory: c:\users\king\appdata\local\pip\cache\wheels\fe\84\be\2628f243102b5e079bea1a31e2716526d0c2e690540d0efcd6 Successfully built standard-cgi Installing collected packages: standard-cgi Successfully installed standard-cgi-3.13.0
11.查看包安装情况
D:\pypi>pip show standard-cgi Name: standard-cgi Version: 3.13.0 Summary: Standard library cgi redistribution. "dead battery". Home-page: https://github.com/youknowone/python-deadlib Author: Author-email: Python Developers <python-deadlib@youknowone.org> License: PSF-2.0 Location: C:\Users\king\AppData\Local\Programs\Python\Python314\Lib\site-packages Requires: Required-by:
https://pypi.org/project/pypiserver/#using-the-docker-image
https://hub.docker.com/r/pypiserver/pypiserver
https://github.com/pypiserver/pypiserver

浙公网安备 33010602011771号