Hey everyone I am new to using docker. I want to build a docker container of my FlaskAPI so I that I could deploy it. Well the problem is that docker container doesn't run. After I build image and then try of run docker container of that image it exists itself.
I am going to share all code directory and file content and error as follows:
What my directory looks like
----ASANA
|-- __pycache__
|-- venv
|-- Dockerfile
|-- .dockerignore
|-- main.py
|-- requirements.txt
|-- tasks.py
|-- yoga_fulldatamodel_test.pth
The main.py looks like
import uvicorn
from fastapi import FastAPI
from fastapi import UploadFile, File
from tempfile import NamedTemporaryFile
import aiofiles
import os
from fastapi.middleware.cors import CORSMiddleware
import tasks
app = FastAPI()
origins = ["*"]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/hello")
def return_greetings():
return {"msg" : "Hello!"}
@app.post("/video")
async def classify_video(file: UploadFile = File(...)):
if not file.filename.endswith(".mp4"):
return {"message": "Only MP4 videos are supported"}
try:
async with aiofiles.tempfile.NamedTemporaryFile("wb", delete=False) as temp:
try:
contents = await file.read()
await temp.write(contents)
except Exception:
return {"message": "There was an error uploading the file"}
finally:
await file.close()
prediction = tasks.prediction_main(temp.name)
except Exception:
return {"message": "There was an error processing the file"}
finally:
os.remove(temp.name)
return {"Pose" : prediction}
The tasks.py looks like
import numpy as np
import os
import mediapipe as mp
import torch
import torch.nn as nn
from torch.utils.data import DataLoader, Dataset
import cv2 as cv2
import pandas as pd
import os
import glob as glob
globals = []
target = ['bhujan', 'padmasan', 'shav', 'tadasana','trik', 'vriksh' ]
device = 'cuda' if torch.cuda.is_available() else 'cpu'
class RNN(nn.Module):
def __init__(self,hidden_dim=80, input_dim=99, sequence_num=16, n_layers=1):
super(RNN, self).__init__()
self.input_dim = input_dim
self.sequence_num = sequence_num
self.n_layers = n_layers
self.hidden_dim = hidden_dim
self.rnn = nn.LSTM(input_dim,hidden_dim, n_layers, batch_first=True)
self.fc = nn.Linear(hidden_dim, 64)
self.fc1 = nn.Linear(64,20)
self.fc2 = nn.Linear(20,6)
def forward(self, input):
h0 = torch.zeros(self.n_layers, self.hidden_dim)
c0 = torch.zeros(self.n_layers, self.hidden_dim)
out,( _,_) = self.rnn(input,(h0, c0))
pred = self.fc(out)
pred = self.fc1(pred)
pred = self.fc2(pred)
output = nn.Softmax( dim=1)(pred)
return output
class YogaDataset(Dataset):
def __init__(self, df):
self.features = df
# self.target = df['1.1']
def __len__(self):
return len(self.features)
def __getitem__(self, index):
features = self.features.loc[index]
# target = self.target[index]
return torch.tensor(features.tolist()).float().to(device)
def landmark_det(image):
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_pose = mp.solutions.pose
BG_COLOR = (192, 192, 192)
with mp_pose.Pose(
static_image_mode=True,
model_complexity=2,
enable_segmentation=True,
min_detection_confidence=0.5) as pose:
a = []
image_height, image_width, _ = image.shape
results = pose.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
for i in range(33):
a.append((results.pose_landmarks.landmark[mp_pose.PoseLandmark(i)].x ,results.pose_landmarks.landmark[mp_pose.PoseLandmark(i)].y ,results.pose_landmarks.landmark[mp_pose.PoseLandmark(i)].z))
b = []
for i in a:
for x in i:
b.append(x)
df = pd.DataFrame(b).T
df = df.to_numpy()
return df
def listframe(path):
local = []
video = cv2.VideoCapture(path)
frame_num = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
f_img = 0
count = 0
while (count<frame_num):
try:
success, cap = video.read()
if count % (int(frame_num / 256)) == 0 and (f_img<256):
df = landmark_det(cap)
local.append(df)
f_img =f_img+1
count = count+1
else:
count = count+1
except:
count = count+1
print(f'done dong doing {path}')
return local
def pre_processing(videopath):
data = np.array(listframe(videopath))
for i in range(len(data)):
for j in range(len(data[i])):
globals.append(data[i][j])
def prediction_main(videopath):
PATH = "yoga_fulldatamodel_test.pth"
model = RNN().to(device)
model.load_state_dict(torch.load(PATH))
pre_processing(videopath)
df_test = pd.DataFrame(globals)
tad = YogaDataset(df_test)
tad_dl = DataLoader(tad, batch_size=16,drop_last=False)
for batch in tad_dl:
pred=(model(batch))
_, is_correct = torch.max(pred.data,1)
array = is_correct.numpy()
values, counts = np.unique(array, return_counts=True)
ind = np.argmax(counts)
return target[values[ind]]
The Dockerfile looks like
FROM python:latest
WORKDIR /app
COPY ./requirements.txt /app/requirements.txt
RUN pip install --upgrade pip
RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
COPY ./* /app/
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]
The .dockerignore file looks like
venv/
__pycache__/
When I run this locally in virtual environment with command. It runs perfectly
uvicorn main:app --reload --host 0.0.0.0 --port 8000
I built container using
docker build -t asana .
Then after that I run container using
docker run -d --name asana -p 80:80 asana
When I use
docker ps
I get following output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
When I use
docker ps -a
I get following output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b82b7684e589 asana "uvicorn main:app --…" 6 seconds ago Exited (1) 4 seconds ago asana
I runed
docker logs asana
This was output that I recieved
Traceback (most recent call last):
File "/usr/local/bin/uvicorn", line 8, in <module>
sys.exit(main())
^^^^^^
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1130, in __call__
return self.main(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1055, in main
rv = self.invoke(ctx)
^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1404, in invoke
return ctx.invoke(self.callback, **ctx.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 760, in invoke
return __callback(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 403, in main
run(
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 568, in run
server.run()
File "/usr/local/lib/python3.11/site-packages/uvicorn/server.py", line 59, in run
return asyncio.run(self.serve(sockets=sockets))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/asyncio/runners.py", line 190, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "uvloop/loop.pyx", line 1517, in uvloop.loop.Loop.run_until_complete
File "/usr/local/lib/python3.11/site-packages/uvicorn/server.py", line 66, in serve
config.load()
File "/usr/local/lib/python3.11/site-packages/uvicorn/config.py", line 471, in load
self.loaded_app = import_from_string(self.app)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/uvicorn/importer.py", line 24, in import_from_string
raise exc from None
File "/usr/local/lib/python3.11/site-packages/uvicorn/importer.py", line 21, in import_from_string
module = importlib.import_module(module_str)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<frozen importlib._bootstrap>", line 1206, in _gcd_import
File "<frozen importlib._bootstrap>", line 1178, in _find_and_load
File "<frozen importlib._bootstrap>", line 1149, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 940, in exec_module
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "/app/main.py", line 10, in <module>
import tasks
File "/app/tasks.py", line 3, in <module>
import mediapipe as mp
File "/usr/local/lib/python3.11/site-packages/mediapipe/__init__.py", line 16, in <module>
import mediapipe.python.solutions as solutions
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/mediapipe/python/solutions/__init__.py", line 17, in <module>
import mediapipe.python.solutions.drawing_styles
File "/usr/local/lib/python3.11/site-packages/mediapipe/python/solutions/drawing_styles.py", line 20, in <module>
from mediapipe.python.solutions.drawing_utils import DrawingSpec
File "/usr/local/lib/python3.11/site-packages/mediapipe/python/solutions/drawing_utils.py", line 19, in <module>
import cv2
File "/usr/local/lib/python3.11/site-packages/cv2/__init__.py", line 181, in <module>
bootstrap()
File "/usr/local/lib/python3.11/site-packages/cv2/__init__.py", line 153, in bootstrap
native_module = importlib.import_module("cv2")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
I have tried everything but can't get to solve the problem. Can anyone help me.