&引用;没有名为“x”的模块;对于Python部署中使用Dockerfile和docker compose的用户定义模块

&引用;没有名为“x”的模块;对于Python部署中使用Dockerfile和docker compose的用户定义模块,python,docker,docker-compose,dockerfile,Python,Docker,Docker Compose,Dockerfile,我正在尝试使用Dockerfile和Docker compose将Python应用程序部署为Docker容器 项目结构如下: ms-request - src __init__.py - exceptions __init__.py ms_request_exceptions.py - messaging __init__.py receive_

我正在尝试使用Dockerfile和Docker compose将Python应用程序部署为Docker容器

项目结构如下:

ms-request
    - src
        __init__.py
        - exceptions
            __init__.py
            ms_request_exceptions.py
        - messaging
            __init__.py
            receive_rabbit.py
            send_rabbit.py
        - request
            __init__.py
            bsrequest.py
    - test
        __init__.py
        test_bsrequest.py
    Dockerfile
    requirements.txt
在我的
receive_rabbit.py
脚本中,我正在从请求和消息包导入函数,如下所示:

from src.request import bsrequest
from src.messaging.send_rabbit import send_message
使用PyCharm执行此操作效果很好。在我使用
export-PYTHONPATH=${PYTHONPATH}:.
更新PYTHONPATH之前,从命令行运行它最初不起作用

我想将其部署为Docker容器,因此我在Docker-compose.yml中为该项目创建了一个Dockerfile和一个条目

Dockerfile:

FROM python:3
WORKDIR /bsreq
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY src/ ./src
COPY test/ ./test
RUN export PYTHONPATH=${PYTHONPATH}:.
CMD [ "python", "/bsreq/src/messaging/receive_rabbit.py" ]
docker-compose.yml:

version: "3.3"

services:
        rabbitmq: [...]
        bs-request:
                build: ./ms-request/
                depends_on:
                        - rabbitmq
                env_file:
                        - rabbit.env
        [...]
使用docker compose up bs request运行此命令时,始终会导致崩溃,错误为
没有名为“src”的模块。

我尝试了Dockerfile中WORKDIR、COPY、PYTHONPATH和CMD行的多种输入变体。所有这些都会导致相同的错误。我尝试过相对导入,它抛出
尝试在没有已知父包的情况下进行相对导入


我希望这是其他人以前遇到过的问题。我需要做什么才能使此部署正常工作?

docker层构建映像的方式会使您的
导出在关联的
运行
命令后立即不可用

FROM python:3
WORKDIR /bsreq
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY src/ ./src
COPY test/ ./test
RUN export PYTHONPATH=${PYTHONPATH}:.  #--> exporting
CMD [ "python", "/bsreq/src/messaging/receive_rabbit.py" ]  #--> last export is not persistent 
作为一种解决方法,您可以使用
ENV PYTHONPATH=${PYTHONPATH}:.
命令设置环境变量,这些变量将在整个构建过程中和最终映像中保持不变。
额外阅读:

无论如何,建议的方法是编写一个
setup.py
文件,并使用
python setup.py install
安装您的软件包,这样它就可以作为一个软件包安装并导入

附言 更好、更新更多的方法是使用
poetry
等工具,这些工具使用
pyproject.toml
(根据PEP 518517),这是python未来的方式
奖金如下:


祝你好运

多谢各位!这几乎是三个答案合一。我将更新项目使用诗歌!