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.
