當通過pip在Docker檔案中安裝Python包時,例如:
pip install --trusted-host pypi.python.org -r requirements.txt
用requirements.txt,例如:
python-dotenv>=0.15.0
psycopg2>=2.8.6。
sqlalchemy>=1.3.22。
numpy>=1.19.0。
rasterio>=1.1.8。
pandas>=1.1.5。
geopandas>=0.8.1。
matplotlib>=3.3.0。
seaborn>=0.11.0。
我最近看到這個警告:
警告:運行 pip 作為'root'用戶可能導致in許可被破壞
和與系統包管理器的沖突行為。
是建議使用一個虛擬環境
來代替:https://pip.pypa.io/warnings/venv
因此我的 "天真 "問題是:
建立一個虛擬環境/或以非root用戶(Docker中的默認用戶)的身份安裝Python包是否有意義,就像人們通常在他/她的本地計算機上做的那樣?
就目前而言,我從不關心這個問題,因為我在一個Docker容器里,根據定義,它承載著一個單一的應用程式,所以我認為這些包是全域安裝的,這是完全可以的。希望我不能破壞我本地機器上的任何東西。
uj5u.com熱心網友回復:
說實話?這并不重要。
在構建容器的程序中使用根用戶通常是必要的,也是人們期待的。pip的警告是 "以root身份運行pip可能會破壞你的作業系統程式所依賴的軟體包"--但你的容器中沒有作業系統。
如果你在構建結束時或在 docker 運行程序中降到一個權限較低的用戶,以 root 身份安裝軟體包不會對你造成任何傷害。實際上,容器是一個單一的行程(你的python應用程式),它對檔案系統的看法與根系統不同--非常像virtualenv所要實作的。
uj5u.com熱心網友回復: 正如@Paul Becotte在他的回答中所說,在你的容器中全域安裝你的包沒有任何風險,但你看到這個警告是因為pip并不關心你是否在容器中運行。
一般Python的良好做法是以非特權用戶身份創建一個虛擬環境: 然后激活它: 然后用 你完全可以根據docker構建的語法進行調整 : 然而,一般docker的良好做法是以非特權用戶運行。所以你在這里有多種選擇:
uj5u.com熱心網友回復: 以root用戶身份運行pip或全域安裝軟體包不是最好的做法。最好的做法是在專案中創建虛擬環境并在那里安裝每一個包。
如果你全域安裝,它實際上會影響其他專案,因為你可能不需要你為專案A安裝的包在你即將啟動的專案B中,如果你洗掉所有的包,專案A將出現中斷,因為它無法再次訪問這些包。
為你的所有專案提供虛擬環境,這樣你就可以放心,所有專案都不會互相影響。
標籤: 下一篇:在pandas資料框中找到一個值
$ python -m venv .venv$ source .venv/bin/activate$ pip install -r requirements.txt命令安裝你的軟體包。
RUN python -m venv /abolute/path/to/venv
RUN source /absolute/path/to/venv/bin/activate & & pip install -r requirements.txt
CMD source /absolute/path/to/venv/bin/activate & & python /path/to/your/app.py
