首页 > 解决方案 > docker-compose 用 pandas 抛出“ModuleNotFoundError”

问题描述

我正在尝试将连接到 mongodb 的非常简单的 Flask API 容器化。对于 API 的输出,我使用的是 pandas 模块。但是,当我运行“docker-compose up”时,出现以下错误:

app_1 | 回溯(最近一次通话最后):
app_1 | 文件“app.py”,第 6 行,在
app_1 | 将熊猫导入为 pd
app_1 | ModuleNotFoundError:没有名为“熊猫”的模块

这是我的码头文件:

FROM python:3.8

ADD . /app

WORKDIR /app

COPY requirements.txt .

RUN pip install -r requirements.txt

这是我的 docker-compose.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 还很陌生,所以任何帮助都将不胜感激。

标签: pythonmongodbdockerdocker-composecontainers

解决方案


有几件事:

DOCKERFILE

FROM python:3.8

WORKDIR /app

ADD . .
COPY requirements.txt .

RUN pip install -r requirements.txt

ENTRYPOINT ["python","app.py"]

ENTRYPOINT(和CMD

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

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

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

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不需要包含commandCMD

volumes

docker-compose.yml不应使用主机目录覆盖容器目录。这样做会覆盖您运行的 eg 并导致问题/app/apppip install

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


推荐阅读