如何减少 Python Docker 镜像大小
我用Python做的Docker镜像有6.35GB,真是太大了。我尝试了多阶段构建和一些其他方法,比如清理缓存,但都没有什么效果。
我可能漏掉了一些很重要的东西。
# Use a smaller base image
FROM python:3.11.4-slim as compiler
# Set the working directory in the container
WORKDIR /app
RUN python -m venv /opt/venv
# Enable venv
ENV PATH="/opt/venv/bin:$PATH"
COPY ./requirements.txt /app/requirements.txt
#RUN pip install -Ur requirements.txt
RUN pip install pip==23.1.2 \
&& pip install -r requirements.txt \
&& rm -rf /root/.cache
FROM python:3.11.4-slim as runner
WORKDIR /app/
COPY --from=compiler /opt/venv /opt/venv
# Enable venv
ENV PATH="/opt/venv/bin:$PATH"
COPY . /app/
# Expose the port the app runs on
EXPOSE 8501
# Define environment variables
ENV STREAMLIT_THEME_BASE dark
ENV STREAMLIT_THEME_SECONDARY_BACKGROUND_COLOR #3A475C
ENV STREAMLIT_THEME_BACKGROUND_COLOR #2d3748
# Run the Streamlit app
CMD ["streamlit", "run", "welcome.py"]
requirements.txt
ibm-generative-ai>=2.0.0
pydantic>=2.6.1
langchain>=0.1.0
streamlit==1.27.2
ray==2.7.1
chromadb>=0.4.14
python-dotenv==1.0.0
beautifulsoup4==4.12.2
sentence-transformers==2.2.2
ibm-watson>=6.1.0
markdown==3.5.2
ibm-generative-ai[langchain]
应用文件夹里有很多.py文件,负责处理语言模型。
pip list
可以查看每个包的大小。
1.5G /app/venv/lib/python3.11/site-packages/torch
420M /app/venv/lib/python3.11/site-packages/triton
170M /app/venv/lib/python3.11/site-packages/ray
126M /app/venv/lib/python3.11/site-packages/pyarrow
86M /app/venv/lib/python3.11/site-packages/transformers
79M /app/venv/lib/python3.11/site-packages/pandas
73M /app/venv/lib/python3.11/site-packages/sympy
29M /app/venv/lib/python3.11/site-packages/kubernetes
25M /app/venv/lib/python3.11/site-packages/streamlit
24M /app/venv/lib/python3.11/site-packages/onnxruntime
23M /app/venv/lib/python3.11/site-packages/sqlalchemy
17M /app/venv/lib/python3.11/site-packages/networkx
16M /app/venv/lib/python3.11/site-packages/pip
15M /app/venv/lib/python3.11/site-packages/langchain
14M /app/venv/lib/python3.11/site-packages/torchvision
14M /app/venv/lib/python3.11/site-packages/nltk
14M /app/venv/lib/python3.11/site-packages/altair
12M /app/venv/lib/python3.11/site-packages/uvloop
12M /app/venv/lib/python3.11/site-packages/tokenizers
9.3M /app/venv/lib/python3.11/site-packages/pydeck
9.0M /app/venv/lib/python3.11/site-packages/pygments
6.7M /app/venv/lib/python3.11/site-packages/setuptools
5.9M /app/venv/lib/python3.11/site-packages/aiohttp
5.6M /app/venv/lib/python3.11/site-packages/pydantic_core
5.3M /app/venv/lib/python3.11/site-packages/watchfiles
5.1M /app/venv/lib/python3.11/site-packages/mpmath
5.0M /app/venv/lib/python3.11/site-packages/safetensors
4.3M /app/venv/lib/python3.11/site-packages/tornado
3.7M /app/venv/lib/python3.11/site-packages/chromadb
3.6M /app/venv/lib/python3.11/site-packages/pydantic
3.5M /app/venv/lib/python3.11/site-packages/regex
3.0M /app/venv/lib/python3.11/site-packages/sentencepiece
2.8M /app/venv/lib/python3.11/site-packages/tzdata
2.8M /app/venv/lib/python3.11/site-packages/pytz
2.6M /app/venv/lib/python3.11/site-packages/joblib
2.5M /app/venv/lib/python3.11/site-packages/rich
2.5M /app/venv/lib/python3.11/site-packages/msgpack
2.5M /app/venv/lib/python3.11/site-packages/greenlet
2.4M /app/venv/lib/python3.11/site-packages/bcrypt
1.7M /app/venv/lib/python3.11/site-packages/fsspec
1.5M /app/venv/lib/python3.11/site-packages/oauthlib
1.4M /app/venv/lib/python3.11/site-packages/fastapi
1.3M /app/venv/lib/python3.11/site-packages/jinja2
1.2M /app/venv/lib/python3.11/site-packages/yarl
1.1M /app/venv/lib/python3.11/site-packages/websockets
1.1M /app/venv/lib/python3.11/site-packages/pyasn1
1.1M /app/venv/lib/python3.11/site-packages/jsonschema
1.1M /app/venv/lib/python3.11/site-packages/httptools
1.0M /app/venv/lib/python3.11/site-packages/anyio
1004K /app/venv/lib/python3.11/site-packages/urllib3
932K /app/venv/lib/python3.11/site-packages/frozenlist
860K /app/venv/lib/python3.11/site-packages/click
820K /app/venv/lib/python3.11/site-packages/markdown
804K /app/venv/lib/python3.11/site-packages/httpx
788K /app/venv/lib/python3.11/site-packages/httpcore
780K /app/venv/lib/python3.11/site-packages/starlette
712K /app/venv/lib/python3.11/site-packages/humanfriendly
696K /app/venv/lib/python3.11/site-packages/uvicorn
696K /app/venv/lib/python3.11/site-packages/toolz
680K /app/venv/lib/python3.11/site-packages/langsmith
632K /app/venv/lib/python3.11/site-packages/pypika
628K /app/venv/lib/python3.11/site-packages/watchdog
620K /app/venv/lib/python3.11/site-packages/posthog
568K /app/venv/lib/python3.11/site-packages/tqdm
548K /app/venv/lib/python3.11/site-packages/h11
540K /app/venv/lib/python3.11/site-packages/idna
540K /app/venv/lib/python3.11/site-packages/gitdb
512K /app/venv/lib/python3.11/site-packages/multidict
484K /app/venv/lib/python3.11/site-packages/requests
480K /app/venv/lib/python3.11/site-packages/importlib_resources
468K /app/venv/lib/python3.11/site-packages/marshmallow
444K /app/venv/lib/python3.11/site-packages/typer
412K /app/venv/lib/python3.11/site-packages/packaging
372K /app/venv/lib/python3.11/site-packages/wrapt
348K /app/venv/lib/python3.11/site-packages/referencing
340K /app/venv/lib/python3.11/site-packages/soupsieve
328K /app/venv/lib/python3.11/site-packages/coloredlogs
328K /app/venv/lib/python3.11/site-packages/certifi
284K /app/venv/lib/python3.11/site-packages/flatbuffers
264K /app/venv/lib/python3.11/site-packages/rsa
260K /app/venv/lib/python3.11/site-packages/orjson
248K /app/venv/lib/python3.11/site-packages/validators
192K /app/venv/lib/python3.11/site-packages/smmap
188K /app/venv/lib/python3.11/site-packages/tenacity
188K /app/venv/lib/python3.11/site-packages/build
188K /app/venv/lib/python3.11/site-packages/asgiref
156K /app/venv/lib/python3.11/site-packages/toml
136K /app/venv/lib/python3.11/site-packages/tzlocal
124K /app/venv/lib/python3.11/site-packages/overrides
120K /app/venv/lib/python3.11/site-packages/markupsafe
120K /app/venv/lib/python3.11/site-packages/backoff
108K /app/venv/lib/python3.11/site-packages/pyproject_hooks
108K /app/venv/lib/python3.11/site-packages/cachetools
108K /app/venv/lib/python3.11/site-packages/blinker
96K /app/venv/lib/python3.11/site-packages/filelock
84K /app/venv/lib/python3.11/site-packages/mdurl
80K /app/venv/lib/python3.11/site-packages/mmh3
68K /app/venv/lib/python3.11/site-packages/deprecated
64K /app/venv/lib/python3.11/site-packages/zipp
64K /app/venv/lib/python3.11/site-packages/attrs
60K /app/venv/lib/python3.11/site-packages/sniffio
48K /app/venv/lib/python3.11/site-packages/aiolimiter
24K /app/venv/lib/python3.11/site-packages/aiosignal
2 个回答
sentence-transformers 是这里最大的罪魁祸首,有时候它无法理解依赖关系,结果就会把一些东西加进去,导致文件变得非常大。
FROM python:3.11.2-slim-bullseye
RUN pip install --no-cache-dir --upgrade pip
RUN pip install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
在你的 dockerfile 中使用这个,它应该能把文件大小减少到大约 2.5GB。
有几种方法可以优化并减小你提供的Docker镜像的大小。以下是一些建议:
使用Alpine或Debian作为基础镜像:与其使用Python基础镜像的精简版,不如试试更小的基础镜像,比如Alpine或Debian。这些镜像是专门为Docker设计的,相比其他操作系统,它们占用的空间更小。你可以使用
python:3.11.4-alpine
或python:3.11.4-buster
作为基础镜像。删除不必要的包:从你运行的
pip list
命令的输出来看,似乎有一些包可能对你的应用程序并不是必需的。考虑删除或优化这些包,以减小镜像的大小。例如,如果你的应用不需要altair
、beautifulsoup4
和networkx
,就可以把它们删掉。使用虚拟环境:使用虚拟环境来管理你应用的包。这样可以通过删除任何未使用的包或库来减小镜像的大小。
避免安装不必要的依赖包:确保只安装你的网站应用所需的包。有时候,当你安装某些包时,它们会自动安装一些依赖包。为了避免这种情况,你可以在运行
pip install
命令时加上--no-deps
,这样就不会安装不必要的包了。使用Dockerignore:在你的Docker构建上下文中使用
.dockerignore
文件,排除任何不需要的文件和目录。这将帮助你减小Docker镜像的大小,并加快构建过程。