2

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.

0 Answers0