Compare commits
10
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b3854ccef1 | ||
|
|
7cca0799f9 | ||
|
|
3a2ce2c96e | ||
|
|
8867d6c117 | ||
|
|
bb740916dd | ||
|
|
020f9fe24d | ||
|
|
e9e795c9d7 | ||
|
|
c8ad1bdb09 | ||
|
|
316aaff6d1 | ||
|
|
664356cbfe |
@@ -2,12 +2,14 @@ shell:
|
||||
pipenv shell
|
||||
run:
|
||||
uvicorn main:app --host 0.0.0.0 --port 8000
|
||||
dev:
|
||||
uvicorn main:app --host 127.0.0.1 --port 8000 --reload
|
||||
update:
|
||||
pipenv lock --pre --clear
|
||||
pipenv lock -r > requirements.txt
|
||||
build: update
|
||||
docker build . -t marcpartensky/docker-api
|
||||
dev: update
|
||||
builddev: update
|
||||
docker-compose up -d --build docker-api
|
||||
push: build
|
||||
docker push marcpartensky/docker-api
|
||||
|
||||
@@ -12,6 +12,7 @@ uvicorn = "*"
|
||||
black = "*"
|
||||
pylint = "*"
|
||||
jedi = "*"
|
||||
ipython = "*"
|
||||
|
||||
[requires]
|
||||
python_version = "3.9.4"
|
||||
|
||||
@@ -5,11 +5,44 @@ import docker
|
||||
from typing import Optional
|
||||
|
||||
from fastapi import FastAPI
|
||||
from fastapi.openapi.utils import get_openapi
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
|
||||
client = docker.DockerClient()
|
||||
client = docker.from_env()
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
origins = [
|
||||
"*",
|
||||
]
|
||||
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=origins,
|
||||
allow_credentials=True,
|
||||
allow_methods=[""],
|
||||
allow_headers=[""],
|
||||
)
|
||||
|
||||
|
||||
def custom_openapi():
|
||||
if app.openapi_schema:
|
||||
return app.openapi_schema
|
||||
openapi_schema = get_openapi(
|
||||
title="Custom title",
|
||||
version="2.5.0",
|
||||
description="This is a very custom OpenAPI schema",
|
||||
routes=app.routes,
|
||||
)
|
||||
openapi_schema["info"]["x-logo"] = {
|
||||
"url": "https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png"
|
||||
}
|
||||
app.openapi_schema = openapi_schema
|
||||
return app.openapi_schema
|
||||
|
||||
|
||||
app.openapi = custom_openapi
|
||||
|
||||
|
||||
@app.get("/")
|
||||
async def index():
|
||||
@@ -30,7 +63,28 @@ async def images():
|
||||
@app.get("/ps")
|
||||
async def ps_all():
|
||||
"""List all containers."""
|
||||
return [c.attrs for c in client.containers.list()]
|
||||
containers = []
|
||||
for raw_container in client.containers.list():
|
||||
health = None
|
||||
if "Health" in raw_container.attrs["State"]:
|
||||
health = raw_container.attrs["State"]["Health"]["Status"]
|
||||
exposed_ports = None
|
||||
if "ExposedPorts" in raw_container.attrs["Config"]:
|
||||
exposed_ports=list(raw_container.attrs["Config"]["ExposedPorts"].keys())
|
||||
container = dict(
|
||||
id=raw_container.id,
|
||||
name=raw_container.name,
|
||||
image=raw_container.image.tags,
|
||||
status=raw_container.status,
|
||||
started_at=raw_container.attrs["State"]["StartedAt"],
|
||||
finished_at=raw_container.attrs["State"]["FinishedAt"],
|
||||
health=health,
|
||||
exposed_ports=exposed_ports,
|
||||
ports=list(raw_container.attrs["NetworkSettings"]["Ports"].keys()),
|
||||
networks=list(raw_container.attrs["NetworkSettings"]["Networks"].keys())
|
||||
)
|
||||
containers.append(container)
|
||||
return containers
|
||||
|
||||
|
||||
@app.get("/ps/ids")
|
||||
@@ -120,3 +174,14 @@ async def unpause(id: str):
|
||||
container = client.containers.get(id)
|
||||
container.unpause()
|
||||
return "unpaused"
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import os, uvicorn
|
||||
|
||||
uvicorn.run(
|
||||
"app",
|
||||
host=os.environ.get("HOST") or "localhost",
|
||||
port=os.environ.get("PORT") or "8000",
|
||||
log_level=os.environ.get("LOG_LEVEL") or "info",
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user