使用 setup.py 构建 Python 多阶段 Docker

标签 python docker dockerfile setuptools setup.py

我正在尝试将我的 Python Docker 构建重写为多阶段构建。我一直在模仿this guide为了做到这一点。

这是我的 Dockerfile:

FROM python:3.8-slim AS compile

RUN apt-get upgrade && apt-get update
RUN apt-get install -y --no-install-recommends build-essential gcc

RUN python -m venv /opt/venv
ENV PATH='/opt/venv/bin:$PATH'

COPY requirements.txt .

RUN pip install --upgrade pip \
    && pip install -r requirements.txt \
    && pip install gunicorn

ADD src/ .
ADD setup.py .
RUN pip install .

FROM python:3.8-slim AS build

ENV GROUP_ID=1000 \
    USER_ID=1000

ENV PYTHONUNBUFFERED=1 \
    PYTHONIOENCODING=UTF-8

COPY --from=compile /opt/venv /opt/venv
ENV PATH ='opt/venv/bin:$PATH'

RUN addgroup -g $GROUP_ID WWW
RUN adduser -D -u $USER_ID -G WWW WWW -s /bin/sh && chown WWW:WWW -R /var/www

USER WWW

EXPOSE 5000

ENTRYPOINT ["gunicorn"]
CMD ["-w", "4", "--bind", "0.0.0.0:5000", "src:wsgi"]

这是setup.py .它目前只保存来自 this tutorial 的随机数据,看起来像这样。我怀疑错误在 packages=setuptools.find_packages() ,虽然我不知道如何解决它。
import setuptools

setuptools.setup(
    name="example-pkg-YOUR-USERNAME-HERE", # Replace with your own username
    version="0.0.1",
    author="Example Author",
    author_email="author@example.com",
    description="A small example package",
    long_description="long_description",
    long_description_content_type="text/markdown",
    url="https://github.com/pypa/sampleproject",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6',
)

在第 11/24 步,运行时 pip install .编译停止,只有 Processing /作为信息。这可能是由于我的安装脚本造成的,但是我还没有找到修复它的方法。
Step 9/24 : ADD src/ .
 ---> d51425cd9672
Step 10/24 : ADD setup.py .
 ---> 2d0378201b2a
Step 11/24 : RUN pip install .
 ---> Running in a747453f98a5
Processing /


这是我的项目的文件结构
❯ tree
.
|-- Dockerfile
|-- bin
|   |-- activate
|   |-- activate.csh
|   |-- activate.fish
|   |-- easy_install
|   |-- easy_install-3.7
|   |-- pip
|   |-- pip3
|   |-- pip3.7
|   |-- python -> python3
|   `-- python3 -> /usr/local/bin/python3
|-- foo.log
|-- include
|-- lib
|   `-- python3.7
|       `-- site-packages
            ...
            lots of files...
            ...

|-- pyvenv.cfg
|-- requirements.txt
|-- setup.py
`-- src
    |-- app.py
    `-- wsgi.py


我已经将构建作为单阶段构建工作,然后没有 src 文件夹,app.py 和 wsgi.py 直接位于项目文件夹中。

任何帮助表示赞赏!

- - - - - 更新 - - - - -

我试过运行 pip install .本地在另一个位置,只有 src/文件夹和 setup.py,结果如下:

这是输出:
Processing /Users/xxx/xxx/test
Building wheels for collected packages: example-pkg-YOUR-USERNAME-HERE
  Building wheel for example-pkg-YOUR-USERNAME-HERE (setup.py) ... done
  Created wheel for example-pkg-YOUR-USERNAME-HERE: filename=example_pkg_YOUR_USERNAME_HERE-0.0.1-cp37-none-any.whl size=1391 sha256=0d2d6eca20042c47f1cbe6a022949e2770f167ae6324a8c2f8ff473baaac7fa7
  Stored in directory: /private/var/folders/7v/5w20zhw90g31z2cl95qngb_80000gn/T/pip-ephem-wheel-cache-e_jn3t7n/wheels/50/63/3f/b109a0dbe8dbf853eb63d219a39f3e501c43d52305bc1c5b38
Successfully built example-pkg-YOUR-USERNAME-HERE
Installing collected packages: example-pkg-YOUR-USERNAME-HERE
Successfully installed example-pkg-YOUR-USERNAME-HERE-0.0.1

最佳答案

您需要更改工作目录,因为您要将所有代码复制到根目录。当你然后运行 ​​pip install .来自 / , pip copies the entire filesystem到一个临时目录,以便从那里安装。我想知道如果你等待它完成会发生什么?
另外,我认为前面的一行可能是错误的。我平时做的apt update && apt -y upgrade而不是相反。
尝试这个:

FROM python:3.8-slim AS compile

RUN apt-get update && apt-get -y upgrade
RUN apt-get install -y --no-install-recommends build-essential gcc

RUN python -m venv /opt/venv
ENV PATH='/opt/venv/bin:$PATH'

WORKDIR /usr/src/app
COPY requirements.txt .

RUN pip install --upgrade pip \
    && pip install -r requirements.txt \
    && pip install gunicorn

# To match the directory structure at host:
ADD src/ ./src
ADD setup.py .
RUN pip install .
有关如何为 Python 图像编写 dockerfiles 的更多信息,请参阅 here .

关于使用 setup.py 构建 Python 多阶段 Docker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61008508/

相关文章:

python - 生成包含另一个 NumPy 数组索引的 NumPy 数组

python - 同时从多个列表中删除元素

node.js - 在 Docker 容器中预缓存 node_modules

python - 使用自定义比较功能对列表列表进行排序

python - PIL 在 OpenCV 图像中产生灰色像素

从主机远程安装卷时,Mongodb 不会在 Docker 容器中启动

linux - Docker 容器化 从虚拟机 LAMP 部署

docker - 无法将 Docker Volume 目录的所有者更改为非 root 用户

java - Flink 1.9 没有方案 : hdfs on kubernetes 的文件系统

apache-spark - Spark2.3.0-bin-without-hadoop,docker-image-tool.sh 缺少 hadoop jar