最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Docker搭建私有PyPI鏡像倉(cāng)庫(kù)的完整步驟教學(xué)

 更新時(shí)間:2025年09月15日 10:07:57   作者:東方佑  
在企業(yè)內(nèi)網(wǎng)或離線開(kāi)發(fā)環(huán)境中,我們常常需要一個(gè)穩(wěn)定、快速且可控制的 Python 包管理方案,本文將詳細(xì)介紹如何使用 devpi 和 Docker 構(gòu)建一個(gè)私有的 PyPI 鏡像服務(wù)器,有需要的小伙伴可以了解下

在企業(yè)內(nèi)網(wǎng)或離線開(kāi)發(fā)環(huán)境中,我們常常需要一個(gè)穩(wěn)定、快速且可控制的 Python 包管理方案。本文將詳細(xì)介紹如何使用 devpi 和 Docker 構(gòu)建一個(gè)私有的 PyPI 鏡像服務(wù)器,并實(shí)現(xiàn)對(duì) Windows 與 Linux 平臺(tái)的 64 位二進(jìn)制包(wheel) 的自動(dòng)下載、緩存和分發(fā)。

通過(guò)本教程,你可以:

  • 快速搭建本地 PyPI 緩存服務(wù)器;
  • 支持不同操作系統(tǒng)平臺(tái)(win_amd64 / manylinux);
  • 自動(dòng)從國(guó)內(nèi)鏡像源(阿里云)預(yù)下載指定依賴包;
  • 實(shí)現(xiàn)高效、安全的企業(yè)級(jí) Python 包管理。

準(zhǔn)備工作

1. 創(chuàng)建項(xiàng)目結(jié)構(gòu)

首先,在你的項(xiàng)目目錄中創(chuàng)建以下文件結(jié)構(gòu):

pypi-mirror/
├── init/
│   ├── Dockerfile
│   └── setup-devpi.sh
├── docker-compose.yml
├── requirements.txt          # 待安裝的包列表
└── devpi-data/               # 數(shù)據(jù)持久化目錄(自動(dòng)生成)

注意:首次運(yùn)行前需手動(dòng)創(chuàng)建空的 devpi-data 目錄用于存儲(chǔ) devpi 數(shù)據(jù)。

2. 編寫(xiě) Dockerfile(./init/Dockerfile)

# 使用 Python 3.10 作為基礎(chǔ)鏡像(國(guó)內(nèi)加速)
FROM python:3.10

# 設(shè)置環(huán)境變量,使用阿里云 PyPI 鏡像
ENV PIP_DEFAULT_TIMEOUT=100 \
    PIP_RETRIES=5 \
    PIP_INDEX_URL=https://mirrors.aliyun.com/pypi/simple/ \
    PIP_TRUSTED_HOST=mirrors.aliyun.com

# 安裝 devpi 相關(guān)組件
RUN pip install --no-cache-dir devpi-server devpi-web devpi-client passlib

# 創(chuàng)建數(shù)據(jù)目錄
RUN mkdir -p /data/server

# 暴露端口
EXPOSE 3141

# 啟動(dòng) devpi-server
CMD ["devpi-server", "--host", "0.0.0.0", "--port", "3141", "--serverdir", "/data/server"]

說(shuō)明:

  • 使用阿里云鏡像提升國(guó)內(nèi)網(wǎng)絡(luò)下載速度。
  • 安裝了 devpi-server(服務(wù)端)、devpi-web(Web 界面)、devpi-client(命令行工具)。
  • 所有數(shù)據(jù)保存在 /data/server,通過(guò)卷掛載實(shí)現(xiàn)持久化。

3. 編寫(xiě)初始化腳本(./init/setup-devpi.sh)

該腳本負(fù)責(zé)配置 devpi 用戶、索引,并根據(jù) requirements.txt 下載并上傳指定包及其依賴。

#!/bin/bash
set -e

echo "配置 devpi 客戶端..."
devpi use http://localhost:3141

# 創(chuàng)建用戶
echo "創(chuàng)建用戶和索引..."
devpi user -c mirroruser password=securepassword123 || echo "用戶已存在"

# 登錄該用戶(關(guān)鍵步驟!否則無(wú)法操作索引)
echo "登錄新創(chuàng)建的用戶..."
devpi login mirroruser --password=securepassword123

# 創(chuàng)建主索引
devpi index -c main bases=root/pypi || echo "索引已存在"

# 切換到主索引
devpi use mirroruser/main

# 創(chuàng)建臨時(shí)目錄
mkdir -p /tmp/packages

# 設(shè)置 pip 使用阿里云鏡像
export PIP_INDEX_URL="https://mirrors.aliyun.com/pypi/simple/"
export PIP_TRUSTED_HOST="mirrors.aliyun.com"

echo "開(kāi)始處理 requirements.txt 中的包..."

# 檢查 requirements.txt 是否存在
if [ ! -f "/app/requirements.txt" ]; then
    echo "錯(cuò)誤: /app/requirements.txt 文件不存在!"
    exit 1
fi

# 第一階段:解析所有包及依賴
all_packages=()
while IFS= read -r package; do
  [[ -z "$package" || "$package" =~ ^# ]] && continue
  echo "分析包: $package"
  
  # 獲取依賴(模擬安裝但不實(shí)際安裝)
  dependencies=$(pip install --no-deps --dry-run "$package" 2>&1 | grep 'Collecting' | awk '{print $2}' | sed 's/[<=>].*//')

  all_packages+=("$package")
  while IFS= read -r dep; do
    [[ -z "$dep" ]] && continue
    all_packages+=("$dep")
  done <<< "$dependencies"
done < /app/requirements.txt

# 去重排序
unique_packages=($(printf "%s\n" "${all_packages[@]}" | sort -u))

# 第二階段:下載 64 位平臺(tái) wheel 包
echo "正在下載 64 位平臺(tái)二進(jìn)制包..."
for package in "${unique_packages[@]}"; do
  echo "處理 $package..."
  rm -f /tmp/packages/*  # 清空臨時(shí)目錄

  # 下載 Windows 64-bit 包(Python 3.13 兼容)
  echo "  下載 win_amd64 版本..."
  pip download --only-binary=:all: --python-version 313 --platform win_amd64 \
    -i https://mirrors.aliyun.com/pypi/simple/ -d /tmp/packages "$package" > /dev/null 2>&1

  # 下載 Linux x86_64 包(manylinux)
  echo "  下載 manylinux_2_17_x86_64 版本..."
  pip download --only-binary=:all: --python-version 313 --platform manylinux_2_17_x86_64 \
    -i https://mirrors.aliyun.com/pypi/simple/ -d /tmp/packages "$package" > /dev/null 2>&1

  # 上傳到 devpi
  for whl in /tmp/packages/*.whl; do
    if [ -f "$whl" ]; then
      echo "  上傳 $whl 到私有倉(cāng)庫(kù)..."
      devpi upload "$whl"
    fi
  done
done

# 第三階段:創(chuàng)建平臺(tái)專用索引
echo "創(chuàng)建平臺(tái)過(guò)濾索引..."

devpi index -c win_amd64 bases=main \
    mirrorsync=1 \
    platform=win_amd64 \
    python_version=3.13 || echo "索引 win_amd64 已存在"

devpi index -c linux_x86_64 bases=main \
    mirrorsync=1 \
    platform=manylinux_2_17_x86_64 \
    python_version=3.13 || echo "索引 linux_x86_64 已存在"

echo "? 初始化完成!DevPI 私有倉(cāng)庫(kù)已就緒。"

echo ""
echo "?? 使用方式如下:"
echo "   Windows 用戶:"
echo "     pip install -i http://<YOUR_LOCAL_IP>:3141/mirroruser/win_amd64/+simple/ <package>"
echo ""
echo "   Linux 用戶:"
echo "     pip install -i http://<YOUR_LOCAL_IP>:3141/mirroruser/linux_x86_64/+simple/ <package>"
echo ""
echo "?? 提示:請(qǐng)將 <YOUR_LOCAL_IP> 替換為宿主機(jī) IP 地址(如 192.168.1.100)"

安全建議:

  • 生產(chǎn)環(huán)境下應(yīng)修改默認(rèn)密碼;
  • 可啟用 HTTPS 和認(rèn)證機(jī)制增強(qiáng)安全性。

4. 配置 Docker Compose(docker-compose.yml)

version: '3.8'

services:
  devpi:
    build:
      context: .
      dockerfile: init/Dockerfile
    container_name: pypi-mirror
    ports:
      - "3141:3141"
    volumes:
      - ./devpi-data:/data/server
      - ./init/setup-devpi.sh:/setup-devpi.sh
      - ./requirements.txt:/app/requirements.txt
    environment:
      - DEVPISERVER_SERVERDIR=/data/server
    restart: unless-stopped
    entrypoint: >
      sh -c "
        if [ ! -f /data/server/.serverversion ]; then
          devpi-init --serverdir /data/server;
        fi;
        devpi-server --host 0.0.0.0 --port 3141 --serverdir /data/server &
        sleep 20 &&
        /setup-devpi.sh &&
        wait
      "

功能說(shuō)明:

  • 第一次啟動(dòng)時(shí)自動(dòng)初始化 devpi 數(shù)據(jù)目錄;
  • 后續(xù)啟動(dòng)直接復(fù)用已有數(shù)據(jù);
  • 腳本延遲執(zhí)行確保服務(wù)已就緒;
  • 支持容器重啟后自動(dòng)恢復(fù)服務(wù)。

獲取熱門(mén)包列表并生成 requirements.txt

為了構(gòu)建一個(gè)實(shí)用的私有鏡像,我們可以基于 PyPI 上最受歡迎的包 來(lái)填充初始內(nèi)容。

步驟一:下載 top-pypi-packages.csv

訪問(wèn) https://hugovk.github.io/top-pypi-packages/

點(diǎn)擊 “Download CSV” 下載最新的 top-pypi-packages.csv 文件。

步驟二:使用 gen_requirements.py 生成 requirements.txt

假設(shè)你有一個(gè)腳本 gen_requirements.py,其功能是從 CSV 中提取前 N 個(gè)最流行包名,輸出為 requirements.txt。

示例代碼(gen_requirements.py):

import csv

# 讀取 top-pypi-packages.csv,提取前 50 個(gè)包
with open('top-pypi-packages.csv', newline='', encoding='utf-8') as f:
    reader = csv.DictReader(f)
    packages = [row['project'] for row in reader]

# 寫(xiě)入 requirements.txt
with open('requirements.txt', 'w') as f:
    for pkg in packages[:50]:  # 取前 50 名
        f.write(f"{pkg}\n")

print("? 已生成 requirements.txt,包含前 50 個(gè)熱門(mén) PyPI 包")

運(yùn)行后生成的 requirements.txt 示例:

requests
urllib3
certifi
idna
charset_normalizer
click
flask
...

啟動(dòng)服務(wù)

第一步:構(gòu)建并啟動(dòng)容器

docker-compose up --build

首次運(yùn)行會(huì)經(jīng)歷以下過(guò)程:

  • 構(gòu)建鏡像;
  • 初始化 devpi 數(shù)據(jù)目錄;
  • 啟動(dòng) devpi-server;
  • 執(zhí)行 setup-devpi.sh 腳本,下載并上傳包;
  • 創(chuàng)建平臺(tái)專用索引。

時(shí)間消耗:取決于 requirements.txt 中包的數(shù)量和網(wǎng)絡(luò)速度,可能需要數(shù)分鐘。

第二步:查看 Web 界面

打開(kāi)瀏覽器訪問(wèn):

http://localhost:3141/mirroruser/main/+simple/

你將看到所有已上傳包的簡(jiǎn)單索引頁(yè)面。

客戶端安裝測(cè)試

Windows 用戶

pip install -i http://192.168.1.100:3141/mirroruser/win_amd64/+simple/ requests

Linux 用戶

pip install -i http://192.168.1.100:3141/mirroruser/linux_x86_64/+simple/ pandas

成功標(biāo)志:

  • 不再連接公網(wǎng) PyPI;
  • 直接從本地服務(wù)器下載 .whl 文件;
  • 安裝速度快,穩(wěn)定性高。

日常使用命令

命令說(shuō)明
docker-compose up啟動(dòng)服務(wù)(無(wú)需重建)
docker-compose down停止并移除容器
docker-compose logs查看日志調(diào)試問(wèn)題

數(shù)據(jù)已掛載至 ./devpi-data,即使刪除容器也不會(huì)丟失已緩存的包。

高級(jí)特性與擴(kuò)展建議

支持更多平臺(tái)

可以擴(kuò)展腳本支持其他平臺(tái),例如:

  • macosx_11_0_arm64(M1/M2 Mac)
  • linux_aarch64

只需添加對(duì)應(yīng)的 --platform 參數(shù)即可。

定期更新包

可通過(guò)定時(shí)任務(wù)拉取新版本包,保持私有倉(cāng)庫(kù)同步。

添加身份驗(yàn)證與權(quán)限控制

devpi 支持細(xì)粒度用戶權(quán)限管理,可用于團(tuán)隊(duì)協(xié)作場(chǎng)景。

集成 CI/CD 流程

在內(nèi)部 CI 環(huán)境中設(shè)置此鏡像為默認(rèn)源,避免外部依賴風(fēng)險(xiǎn)。

總結(jié)

本文介紹了一種完整的解決方案,利用 devpi + Docker + 阿里云鏡像 + 多平臺(tái) wheel 分發(fā) 技術(shù)棧,打造了一個(gè)高性能、跨平臺(tái)、可持久化的私有 PyPI 倉(cāng)庫(kù)。

適用場(chǎng)景:

  • 企業(yè)內(nèi)網(wǎng)隔離環(huán)境;
  • 開(kāi)發(fā)團(tuán)隊(duì)統(tǒng)一依賴管理;
  • 提升 CI/CD 構(gòu)建效率;
  • 減少對(duì)外部源的依賴與安全風(fēng)險(xiǎn)。

核心優(yōu)勢(shì):

  • 自動(dòng)化初始化流程;
  • 支持平臺(tái)差異化索引;
  • 國(guó)內(nèi)鏡像加速下載;
  • 易于部署與維護(hù)。

現(xiàn)在就開(kāi)始搭建屬于你自己的私有 PyPI 倉(cāng)庫(kù)吧!

GitHub 參考資源:

到此這篇關(guān)于使用Docker搭建私有PyPI鏡像倉(cāng)庫(kù)的完整步驟教學(xué)的文章就介紹到這了,更多相關(guān)Docker搭建私有PyPI鏡像倉(cāng)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 用docker搭建selenium grid分布式環(huán)境實(shí)踐之路

    用docker搭建selenium grid分布式環(huán)境實(shí)踐之路

    這篇文章主要介紹了用docker搭建selenium grid分布式環(huán)境實(shí)踐之路,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 在Docker容器下運(yùn)行cronjob的全過(guò)程

    在Docker容器下運(yùn)行cronjob的全過(guò)程

    當(dāng)您想要安排計(jì)劃任務(wù),可以使用內(nèi)置在 macOS 和 Linux 中的常見(jiàn)工具,比如 cron,或者像 AWS Lambda 這樣的特殊工具,,Cron 不如 AWS Lambda 強(qiáng)大,但它在 Unix 系統(tǒng)的后臺(tái)任務(wù)中工作得很好,特別是在使用容器的情況下,本文給大家介紹了在Docker容器下運(yùn)行cronjob的全過(guò)程
    2026-01-01
  • 從Docker容器中備份整個(gè)PostgreSQL的操作步驟

    從Docker容器中備份整個(gè)PostgreSQL的操作步驟

    現(xiàn)在需要從Docker容器中備份整個(gè)PostgreSQL后,然后,使用備份文件在另外一個(gè)pg的docker容器中恢復(fù)過(guò)來(lái),所以本文給大家介紹了從Docker容器中備份整個(gè)PostgreSQL的操作步驟,通過(guò)代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-10-10
  • 使用Nexus創(chuàng)建Docker倉(cāng)庫(kù)的方法步驟

    使用Nexus創(chuàng)建Docker倉(cāng)庫(kù)的方法步驟

    這篇文章主要介紹了使用Nexus創(chuàng)建Docker倉(cāng)庫(kù)的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 私有云存儲(chǔ)Minio Docker鏡像無(wú)法啟動(dòng),提示:Adding local Minio host to 'mc' configuration

    私有云存儲(chǔ)Minio Docker鏡像無(wú)法啟動(dòng),提示:Adding local Minio

    使用Minio在本地搭建私有云存儲(chǔ)時(shí)出現(xiàn)無(wú)法啟動(dòng),查看日志頻繁輸出“Adding local Minio host to 'mc' configuration...”,然后停止了,本文給大家分享私有云存儲(chǔ)Minio Docker鏡像無(wú)法啟動(dòng),提示:Adding local Minio host to 'mc' configuration,感興趣的朋友一起看看吧
    2023-11-11
  • docker 使用mysqldump命令備份導(dǎo)出項(xiàng)目中的mysql數(shù)據(jù)

    docker 使用mysqldump命令備份導(dǎo)出項(xiàng)目中的mysql數(shù)據(jù)

    這篇文章主要介紹了docker 使用mysqldump命令備份導(dǎo)出項(xiàng)目中的mysql數(shù)據(jù)本文通過(guò)命令給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 詳解利用ELK搭建Docker容器化應(yīng)用日志中心

    詳解利用ELK搭建Docker容器化應(yīng)用日志中心

    這篇文章主要介紹了詳解利用ELK搭建Docker容器化應(yīng)用日志中心,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Docker磁盤(pán)空間使用分析與清理的方法

    Docker磁盤(pán)空間使用分析與清理的方法

    本篇文章主要介紹了Docker磁盤(pán)空間使用分析與清理的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • docker搭建zookeeper集群和kafka集群并使用Java測(cè)試詳解

    docker搭建zookeeper集群和kafka集群并使用Java測(cè)試詳解

    本文詳細(xì)介紹了如何在Linux虛擬機(jī)中使用Docker搭建Kafka集群環(huán)境,并通過(guò)Kafka-Manager進(jìn)行可視化管理,文章包括了從鏡像拉取、容器網(wǎng)絡(luò)設(shè)置、Zookeeper和Kafka集群搭建到測(cè)試和使用Java連接集群的全過(guò)程
    2026-01-01
  • 解決docker run 或者 docker restart 啟動(dòng)鏡像就自動(dòng)退出

    解決docker run 或者 docker restart 啟動(dòng)鏡像就自動(dòng)退出

    這篇文章主要介紹了解決docker run 或者 docker restart 啟動(dòng)鏡像就自動(dòng)退出的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11

最新評(píng)論

呼和浩特市| 栾城县| 哈巴河县| 洪雅县| 乌兰县| 湟中县| 精河县| 山丹县| 唐山市| 潞西市| 贵港市| 买车| 郴州市| 青神县| 横峰县| 满城县| 张家界市| 清流县| 宜兰县| 万载县| 临西县| 竹山县| 石柱| 巧家县| 满洲里市| 九龙县| 娄烦县| 铅山县| 河池市| 通辽市| 长汀县| 光山县| 龙州县| 玛沁县| 莫力| 河北区| 平度市| 蓬溪县| 临漳县| 双柏县| 金阳县|