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

Python 如何在Dockerfile中将flask依赖项从一个阶段复制到下一个阶段?,python,docker,dockerfile,Python,Docker,Dockerfile,我正在学习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 \ &

我正在学习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"]
我想使用多级来生成较小的图像,因此选中此选项后,我将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)
回溯(最近一次呼叫最后一次):
文件“/root/.local/lib/python3.8/site-packages/MySQLdb/_-init__;.py”,第18行,在
从…起导入mysql
ImportError:加载共享库libmariadb.so.3时出错:没有这样的文件或目录(需要/root/.local/lib/python3.8/site packages/MySQLdb/_mysql.cpython-38-x86_64-linux-gnu.so)

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

apk add--no cache mariadb dev
也安装mariadb库,您不会在最终映像中安装这些库。它们的缺失是导致错误的原因。

如果仔细分析提供的链接,您可以从
compile image
中看到它复制了生成结果,而不是库。您必须这样思考构建器步骤:“获取编译和构建所需的所有lib,然后在第二阶段获取构建输出”hmmmm我不明白。。。我真正想要实现的是,在第二阶段,只需使用我的应用程序(不需要编译)就可以获得更清晰的图像,并且所需的库Flask_mysqldb是从requirements.txt文件安装的,它将其整理出来。非常感谢你帮了我的忙!