Docker-Compose Throwing "ModuleNotFoundError" with Pandas



我正在尝试容器化一个非常简单的Flask API,它连接到mongodb。对于API的输出,我使用pandas模块。然而,当我运行"docker compose-up"时,我会得到以下错误:

app_1|Traceback(最后一次调用):
app_1|File"app.py";,第6行,在
app_1|导入pandas作为pd
apps_1|ModuleNotFoundError:没有名为"pandas"的模块

这是我的档案:

FROM python:3.8
ADD . /app
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt

这是我的码头组合。yml:

app:
build: .
command: python -u app.py
ports:
- "5000:5000"
volumes:
- .:/app
links:
- db
db:
image: mongo:latest

我的requirements.txt如下:

pymongo==3.11.4
Flask==1.1.2
pandas==1.1.3

既然requirements.txt中有熊猫,容器不应该有模块吗?我没有得到这个错误的pymongo或Flask,这就是为什么我很好奇。我是Docker的新手,如果有任何帮助,我将不胜感激。

两件事:

DOCKERFILE

FROM python:3.8
WORKDIR /app
ADD . .
COPY requirements.txt .
RUN pip install -r requirements.txt
ENTRYPOINT ["python","app.py"]

ENTRYPOINT(和CMD)

您最好从容器中运行Python应用程序。在Dockerfile的末尾添加:ENTRYPOINT ["python","app.py"]

注意DockerENTRYPOINT是运行容器时的默认(入口点)。将其设置为运行容器时要运行的二进制文件(即python app.py)是一种很好的做法。DockerENTRYPOINT可以被Docker Composeentrypoint覆盖。还有CMD。最好将其设置为运行容器时要运行的默认参数和标志。在docker-compose.yml中,command覆盖DockerCMD

然后您可以独立运行容器来测试它:

docker build 
--tag=68567602:v1 
--file=./Dockerfile 
.
docker run 
--interactive --tty --rm 
--publish=5000:5000 
68567602:v1

WORKDIR

在Dockerfile中,最好先设置WORKDIR,以避免重复引用,即

docker-compose.yml

app:
build: .
ports:
- "5000:5000"
db:
image: mongo:latest

command

docker-compose.yml不需要包括command,除非您想覆盖容器的CMD设置

volumes

docker-compose.yml应该而不是用主机的/app目录覆盖容器的/app目录。这样做会覆盖您运行并导致问题的例如pip install

我想你不想要links条目。您的python应用程序可以通过您给它的名称db来引用MongoDB服务

最新更新