I am trying to containerize a very simple Flask API that connects to mongodb. For the API’s output, I am using the pandas module. However, when I run ‘docker-compose up’, I get the following error:
app_1 | Traceback (most recent call last):
app_1 | File “app.py”, line 6, in
app_1 | import pandas as pd
app_1 | ModuleNotFoundError: No module named ‘pandas’
This is my dockerfile:
FROM python:3.8 ADD . /app WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt
And this is my docker-compose.yml:
app: build: . command: python -u app.py ports: - "5000:5000" volumes: - .:/app links: - db db: image: mongo:latest
My requirements.txt is as follows:
pymongo==3.11.4 Flask==1.1.2 pandas==1.1.3
Since I have pandas in the requirements.txt, shouldn’t the container have the module? I’m not getting this error for pymongo or Flask, which is why I am curious. I’m fairly new to Docker, so any help would be much appreciated.
Advertisement
Answer
A couple of things:
DOCKERFILE
FROM python:3.8 WORKDIR /app ADD . . COPY requirements.txt . RUN pip install -r requirements.txt ENTRYPOINT ["python","app.py"]
ENTRYPOINT
(and CMD
)
You would be better placed running the Python app from within the container. Add: ENTRYPOINT ["python","app.py"]
to the end of the Dockerfile.
NOTE Docker
ENTRYPOINT
is the default (entrypoint) when running the container. It’s a good practice to set this to the binary (i.e.python app.py
) that you want to run when you run the container. DockerENTRYPOINT
can be overridden with Docker Composeentrypoint
. There’s alsoCMD
. It’s good practice to set this to the default arguments and flags that you want to run when you run the container. In thedocker-compose.yml
,command
overrides DockerCMD
.
Then you can run the container standalone to test it:
docker build --tag=68567602:v1 --file=./Dockerfile . docker run --interactive --tty --rm --publish=5000:5000 68567602:v1
WORKDIR
In the Dockerfile, it’s a good idea to set the WORKDIR
first to save duplicating the reference, i.e.
docker-compose.yml
app: build: . ports: - "5000:5000" db: image: mongo:latest
command
The docker-compose.yml
need not include command
unless you want to override the container’s CMD
settings
volumes
The docker-compose.yml
should not overwrite the container’s /app
directory with your host’s /app
directory. Doing this overwrites the e.g. pip install
that you ran and is causing the problem
links
I think you don’t want the links
entry. Your python app can reference the MongoDB service by the name you gave it db