如何减少 Python Docker 镜像大小

1 投票
2 回答
158 浏览
提问于 2025-04-14 18:17

我用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 个回答

0

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。

0

有几种方法可以优化并减小你提供的Docker镜像的大小。以下是一些建议:

  1. 使用Alpine或Debian作为基础镜像:与其使用Python基础镜像的精简版,不如试试更小的基础镜像,比如Alpine或Debian。这些镜像是专门为Docker设计的,相比其他操作系统,它们占用的空间更小。你可以使用 python:3.11.4-alpinepython:3.11.4-buster 作为基础镜像。

  2. 删除不必要的包:从你运行的 pip list 命令的输出来看,似乎有一些包可能对你的应用程序并不是必需的。考虑删除或优化这些包,以减小镜像的大小。例如,如果你的应用不需要 altairbeautifulsoup4networkx,就可以把它们删掉。

  3. 使用虚拟环境:使用虚拟环境来管理你应用的包。这样可以通过删除任何未使用的包或库来减小镜像的大小。

  4. 避免安装不必要的依赖包:确保只安装你的网站应用所需的包。有时候,当你安装某些包时,它们会自动安装一些依赖包。为了避免这种情况,你可以在运行 pip install 命令时加上 --no-deps,这样就不会安装不必要的包了。

  5. 使用Dockerignore:在你的Docker构建上下文中使用 .dockerignore 文件,排除任何不需要的文件和目录。这将帮助你减小Docker镜像的大小,并加快构建过程。

撰写回答