Skip to content

Commit a1ece7c

Browse files
add docker image endpoint code
1 parent 048add8 commit a1ece7c

File tree

3 files changed

+64
-10
lines changed

3 files changed

+64
-10
lines changed

src/inferadmin/docker.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from aiodocker import Docker
2+
3+
class DockerManagerClass:
4+
docker: Docker | None = None
5+
6+
async def init(self):
7+
try:
8+
self.docker = Docker()
9+
except Exception as e:
10+
raise Exception(f"Failed to initialize Docker: {e}")
11+
12+
def get(self) -> Docker:
13+
if self.docker is None:
14+
raise Exception("Docker not initialized")
15+
return self.docker
16+
17+
async def close(self):
18+
if self.docker is not None:
19+
await self.docker.close()
20+
21+
22+
DockerManager = DockerManagerClass()

src/inferadmin/lifespan.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
from contextlib import asynccontextmanager
22
from fastapi import FastAPI
33
from inferadmin.config.loader import config_manager
4+
from inferadmin.docker import DockerManager
45

56
@asynccontextmanager
67
async def lifespan(app: FastAPI):
78
await config_manager.load()
8-
yield
9+
await DockerManager.init()
10+
11+
yield # run fastapi app
12+
13+
await DockerManager.close()
Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,46 @@
1+
from aiodocker import DockerError
12
from fastapi import APIRouter
2-
from .models import GetImagesResponse, PutImageRequest, DeleteImageRequest
3+
4+
from inferadmin.docker import DockerManager
35
from inferadmin.routes.standard_models import BasicResponse
46

5-
router = APIRouter(
6-
prefix='/images'
7-
)
7+
from .models import DeleteImageRequest, GetImagesResponse, PutImageRequest
8+
9+
router = APIRouter(prefix="/images")
10+
811

9-
@router.get('/')
12+
@router.get("/")
1013
async def get_images() -> GetImagesResponse:
1114
pass
1215

13-
@router.put('/')
16+
17+
@router.put("/")
1418
async def put_images(data: PutImageRequest) -> BasicResponse:
15-
pass
19+
"""Pull a docker image"""
20+
docker = DockerManager.get()
21+
22+
try:
23+
await docker.images.pull(data.repo)
24+
except Exception as e:
25+
return BasicResponse(success=False, error_message=str(e))
1626

17-
@router.delete('/')
27+
return BasicResponse(success=True, error_message=None)
28+
29+
30+
@router.delete("/")
1831
async def delete_images(data: DeleteImageRequest) -> BasicResponse:
19-
pass
32+
"""Delete a docker image"""
33+
docker = DockerManager.get()
34+
35+
try:
36+
await docker.images.get(data.id)
37+
except DockerError as e:
38+
if e.status == 404:
39+
return BasicResponse(success=True, error_message=None)
40+
41+
try:
42+
await docker.images.delete(data.id)
43+
except Exception as e:
44+
return BasicResponse(success=False, error_message=str(e))
45+
46+
return BasicResponse(success=True, error_message=None)

0 commit comments

Comments
 (0)