首页 > 解决方案 > 将诗歌虚拟环境从 slim-image 复制到 alpine-image 并运行

问题描述

我想在slim映像中构建包,然后将构建的包复制到alpine一个。为此,我创建了 Dockerfile:

FROM python:3.8.7-slim AS builder

ENV POETRY_VIRTUALENVS_CREATE=false
WORKDIR /app
RUN apt-get update
RUN apt-get install -y build-essential
RUN apt-get install -y libldap2-dev  # for python-ldap
RUN apt-get install -y libsasl2-dev  # for python-ldap
COPY poetry.lock pyproject.toml ./
RUN python -m pip install --upgrade pip && pip install poetry && poetry install --no-dev

FROM python:3.8.7-alpine3.13 AS runtime
COPY --from=builder /root/* /root/
WORKDIR /app
COPY pythonapline .
#RUN python manage.py makemigrations && python manage.py migrate
EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

默认情况下poetry在目录中创建虚拟环境~/.cache/pypoetry/virtualenvs (Linux)

运行运行时映像时出现导入错误。似乎应该激活复制的虚拟环境或类似的东西?

标签: pythondockerfiledocker-multi-stage-build

解决方案


问题是您没有将安装包正确复制到runtime阶段。请注意,这ENV POETRY_VIRTUALENVS_CREATE=false会使诗歌在不使用虚拟环境的情况下安装依赖项。

尝试改变这一点

COPY --from=builder /root/* /root/

COPY --from=builder /usr/local/lib/python3.8/site-packages /usr/local/lib/python3.8/site-packages

另请注意,您可以通过在运行之前分离诗歌本身的安装来更好地利用缓存,poetry install --no-dev这样您就不必在更新依赖项后重新安装诗歌。

RUN python -m pip install --upgrade pip && pip install poetry
COPY poetry.lock pyproject.toml ./
poetry install --no-dev

但是,不能保证在 slim 上工作的二进制文件也与使用 musl libc 的 alpine 兼容。不鼓励将 alpine linux 用于 Python 应用程序。


推荐阅读