廣義問題
壓縮 Docker 映像中的大檔案夾然后在映像入口點的容器級別提取它們有什么缺點嗎?
缺點:
- 不能重復使用。(但假設它是一次性影像,這不是什么大問題)
- 由于提取檔案夾的延遲,影像啟動緩慢。
優點:
- 在某些情況下,影像尺寸明顯更小!!
dockerfile 示例:
FROM some/image:latest
COPY ./venv.tar.gz .
COPY ./some_python_script.py .
SHELL ["/bin/bash", "-c"]
# if directory venv does not exist: extract it to root then remove the tar file
ENTRYPOINT [ ! -d "venv" ] && tar xzf venv.tar.gz && rm venv.tar.gz || \
# else: it already exists so we don't have to waste time doing it again
echo 'venv already extracted from tar' && \
# these always run
source venv/bin/activate && \
cd /app && \
python "some_python_scipt.py"
為什么我要問
我已經對接了整個 PyTorch 地理空間訓練應用程式,不包括資料。但是,地理空間培訓包非常龐大,更不用說 PyTorch 和 Cuda 庫的大小了。我的映像的虛擬環境僅是 10.9GB,因此總映像大小為 11.5GB。這也是在多階段構建中使用 conda-pack 優化的 v-env。預先壓縮它們會將影像大小減少到 5.2GB。
運行中的容器顯然在運行時最終變成了原來的 11.5GB。但是,減小的影像大小使管理變得更加容易,尤其是在從 docker hub 推拉時的速度方面。
示例壓縮 conda 虛擬環境的完整要點:https ://gist.github.com/NoahTarr/cdc0af59ebc84fc9d936eece35ebfaf7
uj5u.com熱心網友回復:
我建議此設定存在三個問題:
在本地磁盤空間方面,這將需要 1.5 倍的存盤空間來運行容器的單個實體,然后每個額外的實體將需要與整個虛擬環境的(大)大小相等的額外空間。也就是說,您需要一份壓縮的 venv 副本,以及每個容器的一份未壓縮的 venv 副本。如果未壓縮的 venv 在映像中,則您只需要在所有容器中創建一份副本。
解壓縮大的 tar 檔案需要時間,這可能會使您的容器啟動速度明顯變慢。
我有實際問題
docker push和docker pull大于約 1 GB 的單個層。您可以采取一些技巧來縮小各個層,例如RUN pip install pytorch在RUN pip install -r requirements.txt. 使用此設定,您別無選擇,只能擁有一個 5 GB 的 tarfile 層。
盡管如此,我相信這種方法會從根本上奏效。再次,假設您可以docker push并且docker pull成功。我要做的一個改變是將復雜的 ENTRYPOINT 行分解為一個單獨的 shell 腳本:
#!/bin/sh
# entrypoint.sh
# Unpack the virtual environment if it doesn't already exist
if [ ! -d venv ]; then
tar xzf venv.tar.gz
else
echo 'venv already extracted from tar'
fi
# Add the virtual environment into $PATH
. venv/bin/activate
# Run the main container CMD
exec "$@"
# Dockerfile
...
WORKDIR /app
ENTRYPOINT ["./entrypoint.sh"]
CMD ["python", "some_python_script.py"]
這將使您可以在不實際運行主應用程式的情況下執行諸如docker run --rm your-image ls venv/python3.10/site-packages查看分解樹內部的操作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/487321.html
下一篇:提取由符號分隔的資料塊
