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

时间:2021-02-14 20:10:04

标签: 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 \
    && 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"]

我想使用 multistage 来获得较小的图像,因此检查此 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 依赖项(它在 requirements.txt 中),但它在 requirements.txt 文件中并且在第一个 Dockerfile 中工作,所以我没有知道我错过了什么,好像我做对了第二阶段的 COPY 步骤应该复制第一阶段安装的依赖项,对吗?。这是我尝试旋转容器时得到的输出:

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)

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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