python - 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 还很陌生,所以任何帮助都将不胜感激。
解决方案
有几件事:
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
将其设置为您在运行容器时要运行的二进制文件(即 )是一个很好的做法。DockerENTRYPOINT
可以被 Docker Compose 覆盖entrypoint
。还有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
不应使用主机目录覆盖容器目录。这样做会覆盖您运行的 eg 并导致问题/app
/app
pip install
links
我想你不想links
进入。您的 python 应用程序可以通过您给它的名称引用 MongoDB 服务db
推荐阅读
- python - 使用 pip 安装时忽略一些依赖项
- google-cloud-platform - 谷歌云监控和每个事件的通知数量
- ios - Mapbox 表达式检查 MGLStyleLayer 的属性并与字符串进行比较
- ms-project - 如何使用其他日期字段导入实际完成...是否有“规则”?
- string - 如何比较数字分组并返回最大的数字?
- yaml - 从 Azure Pipeline .yaml 清除退出?
- c# - c# Web api嵌套json字段动态变化
- c++ - 使用 AST 匹配器匹配可变参数模板参数
- javascript - nodej.s 中的日期时间格式
- typescript - AWS SDK client-s3:如何从 PutObjectCommandOutput 获取 VersionId?