我正在尝试将我的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中,当运行with pip install .时,编译停止,只有with作为信息。这可能是由于我的设置脚本,但是我还没有找到修复它的方法。
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/ folder和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发布于 2020-11-10 20:58:48
您需要更改工作目录,因为您正在将所有代码复制到根目录。然后,当您从/运行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镜像编写dockerfile的更多信息,请参阅here。
https://stackoverflow.com/questions/61008508
复制相似问题