如何在Dockerfile中将flask依赖项从一个阶段复制到下一个阶段?

2024-05-23 21:08:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习Docker,我有一个Dockerfile,其中有一个简单的应用程序,例如:

FROM python:3.8-alpine
WORKDIR /code
ENV FLASK_APP App.py
ENV FLASK_RUN_HOST 0.0.0.0
ENV FLASK_RUN_PORT :3001
RUN apk update \
    && apk add --virtual build-deps gcc python3-dev musl-dev \
    && apk add --no-cache mariadb-dev
COPY ./myapp/requirements.txt requirements.txt
RUN pip install --no-cache-dir -vv -r requirements.txt
ADD ./myapp .
EXPOSE 3001
CMD ["flask", "run"]

我想使用多级生成更小的图像,因此选中此https://pythonspeed.com/articles/multi-stage-docker-python/我将Dockerfile更改为:

FROM python:3.8-alpine as builder
COPY ./myapp/requirements.txt requirements.txt
RUN apk update \
    && apk add --virtual build-deps gcc python3-dev musl-dev \
    && apk add --no-cache mariadb-dev
RUN pip install --user -r requirements.txt

FROM python:3.8-alpine
ADD ./myapp .
COPY --from=builder /root/.local /root/.local
ENV PATH=/root/.local:$PATH
ENV FLASK_APP App.py
ENV FLASK_RUN_HOST 0.0.0.0
ENV FLASK_RUN_PORT 3000
CMD ["python", "-m", "flask", "run"] 

但是当运行容器时,我得到一个错误,告诉我没有安装MySQL dp dependecy(它在requirements.txt中),但是它在requirements.txt文件中,并且在第一个Dockerfile中工作,所以我不知道我遗漏了什么,好像我做对了第二阶段的复制步骤应该复制第一阶段安装的依赖项,对吗?。这是我尝试旋转容器时得到的输出:

Traceback (most recent call last):
  File "/root/.local/lib/python3.8/site-packages/MySQLdb/__init__.py", line 18, in <module>
    from . import _mysql
ImportError: Error loading shared library libmariadb.so.3: No such file or directory (needed by /root/.local/lib/python3.8/site-packages/MySQLdb/_mysql.cpython-38-x86_64-linux-gnu.so)

Tags: runfrompydevdockerfileenvtxtadd
2条回答

mysql是从requirements.txt安装的还是由apk MariahDb安装的?如果是后者,那么这就是第二张图片中缺少的内容;它不是pip安装的--用户在.local下它在第一个映像中安装在系统范围内,但在第二个映像中不安装

apk add no-cache mariadb-dev还要安装MariaDB库,而不是在最终映像中安装。他们的缺乏是你犯错误的原因

相关问题 更多 >