多階段構建的影像為 292 MB,而單階段構建的影像為 235 MB。誰能幫我理解為什么?
這是 Dockerfile。
一級構建:
# syntax=docker/dockerfile:1
FROM python:3.9.13-alpine3.16
WORKDIR /project
ENV FLASK_APP=run.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
多階段構建:
# syntax=docker/dockerfile:1
FROM python:3.9.13-alpine3.16 AS compile-image
RUN apk add --no-cache gcc musl-dev linux-headers
ENV VIRTUAL_ENV=/opt/venv
RUN python -m venv $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
COPY requirements.txt .
RUN pip install -r requirements.txt
WORKDIR /project
COPY . .
RUN pip install .
FROM python:3.9.13-alpine3.16
COPY --from=compile-image $VIRTUAL_ENV $VIRTUAL_ENV
ENV FLASK_APP=run.py
ENV FLASK_RUN_HOST=0.0.0.0
EXPOSE 5000
CMD ["flask", "run"]
注意:我使用了以下文章中建議的方法的改編版本:https ://pythonspeed.com/articles/multi-stage-docker-python/ 。
uj5u.com熱心網友回復:
當 Dockerfile 中有第二個 FROM 陳述句時,該陳述句之前的所有內容都不再是映像的一部分,包括 ENV 陳述句。
所以在你的第二部分,VIRTUAL_ENV沒有價值。這導致您的 COPY 陳述句COPY --from=compile-image沒有路徑。我嘗試查看檔案,這是一個有效的宣告,但檔案沒有描述當你這樣做時會發生什么。我對其進行了測驗,似乎它將所有內容都復制compile-image到了您的新影像中。這會導致影像大小翻倍。
要修復它,您可以將第二部分中的環境變數替換為您想要的路徑,如下所示
# syntax=docker/dockerfile:1
FROM python:3.9.13-alpine3.16 AS compile-image
RUN apk add --no-cache gcc musl-dev linux-headers
ENV VIRTUAL_ENV=/opt/venv
RUN python -m venv $VIRTUAL_ENV
COPY requirements.txt .
RUN pip install -r requirements.txt
WORKDIR /project
COPY . .
RUN pip install .
FROM python:3.9.13-alpine3.16
COPY --from=compile-image /opt/venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
ENV FLASK_APP=run.py
ENV FLASK_RUN_HOST=0.0.0.0
EXPOSE 5000
CMD ["flask", "run"]
由于您可能希望 PATH 在最終影像中包含 /opt/venv/bin,因此我已將 PATH 的設定移至第二階段。如果它在第一階段,當你點擊第二個 FROM 陳述句時它也會丟失。
我不是 Python 專家,但python -m venv如果在運行時需要,您可能還需要將陳述句移動/復制到第二階段。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/490320.html
