繁体   English   中英

docker-compose 用 Pandas 抛出“ModuleNotFoundError”

[英]docker-compose throwing “ModuleNotFoundError” with pandas

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

应用程序_1 | 回溯(最近一次调用最后一次):
应用程序_1 | 文件“app.py”,第 6 行,在
应用程序_1 | 将熊猫导入为 pd
应用程序_1 | ModuleNotFoundError: 没有名为“pandas”的模块

这是我的 dockerfile:

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中有pandas,容器不应该有模块吗? 对于 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 应用程序。 添加: ENTRYPOINT ["python","app.py"]到 Dockerfile 的末尾。

注意Docker ENTRYPOINT是运行容器时的默认值(入口点)。 将它设置为运行容器时要运行的二进制文件(即python app.py )是一个很好的做法。 Docker ENTRYPOINT可以被 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不需要包含command除非你想覆盖容器的CMD设置

volumes

docker-compose.yml应该覆盖容器的/app与你的主目录/app目录。 这样做会覆盖您运行的 eg pip install并导致问题

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM