使用 docker + devpi 搭建本地 pypi 源

PrivateRookie發表於2019-04-07

前一段時間開發需要經常使用 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/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/

最後歡迎關注我的殭屍公眾號 :) CodeWar

本作品採用《CC 協議》,轉載必須註明作者和本文連結

多少事,從來急。天地轉,光陰迫。

相關文章