使用 docker + devpi 搭建本地 pypi 源

前一段時間開發需要經常使用 pip 下載,雖然把 pip 源改成了國內源,但我對速度還是不滿意,更爲重要的是集成
測試環境是離線的,要在集成測試環境開發顯然需要搭建自己的本地 pip 源。在使用 devpi 之前我曾使用過 pip2pi,但有個 bug 導致離線環境下的 tox 命令總是失敗,所以最後採用 devpi 搭建 pip 源。這裏使用 docker 部署,方便又快速,如果不小心弄崩了也只需要重新運行 docker 容器就好了。如果你的環境沒有安裝 docker 可以自行搜素安裝方法,比如 docker 社區的文檔 install docker。如果你是 Centos 用戶,可以使用以下方法安裝

sudo yum update
sudo yum -y install docker
sudo systemctl enable docker
sudo systemctl start docker

接下來使用使用 docker 部署一個 Python 本地鏡像源,我們可以使用 docker hub 上已有的鏡像,我這裏選擇的是
muccg/devpi 這個鏡像

# 設置 devpi 服務器管理員密碼
DEVPI_PASSWORD = 123

mkdir -p /src/docker/devpi
mkdir /tmp/wheelhouse

docker run -d --name devpi \
    --publish 3141:3141 \
    --volume /tmp/wheelhouse:/wheelhouse
    --volume /srv/docker/devpi:/data \
    --env=DEVPI_PASSWORD=$DEVPI_PASSWORD \
    --restart always \
    muccg/docker-devpi

接着先在本地下載好所需的wheel包,requirements.txt文件內容即爲我們需要的 Python 庫列表

pip wheel --wheel-dir /tmp/wheelhouse -r requirements.txt

如果從 pip 源下載的庫已經是 wheel 包的話文件將會被直接放在 /tmp/wheelhouse 內,如果是
tar 包,pip 會先 build 出 wheel 包,這可能需要一些時間。下載完成後 wheelhouse 內容類似

ll /tmp/wheelhouse
total 524K
-rwxrwxrwx 1 rookie rookie 155K Apr  6 23:40 certifi-2019.3.9-py2.py3-none-any.whl
-rwxrwxrwx 1 rookie rookie 131K Apr  6 23:40 chardet-3.0.4-py2.py3-none-any.whl
-rwxrwxrwx 1 rookie rookie  58K Apr  6 23:40 idna-2.8-py2.py3-none-any.whl
-rwxrwxrwx 1 rookie rookie  57K Apr  6 23:40 requests-2.21.0-py2.py3-none-any.whl
-rwxrwxrwx 1 rookie rookie 116K Apr  6 23:40 urllib3-1.24.1-py2.py3-none-any.whl

下載完成後如果本地環境安裝了devpi客戶端,可以直接上傳 wheel 包,不過由於我們在創建容器時已經
wheelhouse 文件夾掛載進去,也可以在在容器裏直接操作

# 進入容器
docker exec -it -u root devpi bash

# 登陸並上傳
devpi use http://<host_ip>:3141/root/public --set-cfg
devpi login root 123
devpi upload --from-dir /wheelhouse

上傳完成後可以使用 http://<host_ip>:3141 查看 pip 本地源服務器狀態。
若要臨時使用可以使用 pip install 的 --index--trusted-host 選項

pip install --index http://<host_ip>:3141/root/public/+simple/ \
            --trusted-host <host_ip>

或者修改 pip.conf 文件永久使用

# vim ~/.pip/pip.conf
[global]
index_url = http://<host_ip>:3141/root/public/+simple/
trusted-host = <host_ip>
[search]
index = http://<host_ip>:3141/root/public/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章