我的目标是停靠python 3.6 Web应用程序。 在我的工作中,我开发了我的Web应用程序正在使用的私有python包(' VmwareProviderBL')。
构建我的docker镜像工作完美,但是当我尝试运行它时,我收到一条错误,说我的私有Python包没有找到。
我的Dockerfile
# Use an official Python runtime as a parent image
FROM python:3.6-slim
# Set the working directory to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
ADD . /app
# Install any needed packages specified in requirements.txt
RUN pip install -r requirements.txt
# Make port 80 available to the world outside this container
EXPOSE 80
# Define environment variable
ENV NAME World
# Run WebController.py when the container launches
CMD ["python", "WebApi/WebController.py"]
尝试运行图像时出现错误
Traceback (most recent call last):
File "WebApi/WebController.py", line 3, in <module>
from VmwareProviderBL import SnapshotBL, MachineBL, Utils
ModuleNotFoundError: No module named 'VmwareProviderBL'
我的包层次结构
--VmwareVirtualMachineProvider
--WebApi
--VmwareProviderBL
--requirements
--Dockerfile
任何想法? 我知道我需要以某种方式将此软件包添加到我的Dockerfile,没有在网上找到任何示例。
答案 0 :(得分:2)
当你import
一个模块时,Python查看(a)内置路径(sys.path
),(b)PYTHONPATH
变量中的位置,以及(c)in包含您正在运行的脚本的目录。
您正在为模块安装要求(pip install -r requirements.txt
),但您永远不会安装VmwareProviderBL
模块本身。这意味着它不会在上面的(a)中提供。您正在运行的脚本(WebApi/WebController.py
)与VmwareProviderBL
模块位于同一目录中,因此排除了(c)。
解决此问题的最佳方法是在项目中包含setup.py
文件,这样您就可以pip install .
安装需求和模块本身。
您还可以修改PYTHONPATH
环境变量以包含包含VmwareProviderBL
模块的目录。例如,添加到Dockerfile:
ENV PYTHONPATH=/app