&引用;没有名为“x”的模块;对于Python部署中使用Dockerfile和docker compose的用户定义模块
我正在尝试使用Dockerfile和Docker compose将Python应用程序部署为Docker容器 项目结构如下:&引用;没有名为“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_
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未来的方式
奖金如下:
祝你好运 多谢各位!这几乎是三个答案合一。我将更新项目使用诗歌!