我正在尝试容器化一个非常简单的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"]
。
注意Docker
ENTRYPOINT
是运行容器时的默认(入口点)。将其设置为运行容器时要运行的二进制文件(即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
我想你不想要links
条目。您的python应用程序可以通过您给它的名称db
来引用MongoDB服务