Add initial docker-container support (#7)
* Initial docker-container support * lint
This commit is contained in:
parent
11a62d0023
commit
c24fad522e
20
scone/default/recipes/docker.py
Normal file
20
scone/default/recipes/docker.py
Normal file
@ -0,0 +1,20 @@
|
||||
from scone.default.utensils.docker_utensils import DockerContainerRun
|
||||
from scone.head.kitchen import Kitchen
|
||||
from scone.head.recipe import Recipe, RecipeContext
|
||||
from scone.head.utils import check_type
|
||||
|
||||
|
||||
class DockerContainer(Recipe):
|
||||
_NAME = "docker-container"
|
||||
|
||||
def __init__(self, recipe_context: RecipeContext, args: dict, head):
|
||||
super().__init__(recipe_context, args, head)
|
||||
|
||||
self.image = check_type(args.get("image"), str)
|
||||
self.command = check_type(args.get("command"), str)
|
||||
|
||||
async def cook(self, kitchen: Kitchen) -> None:
|
||||
kitchen.get_dependency_tracker()
|
||||
await kitchen.ut1areq(
|
||||
DockerContainerRun(self.image, self.command), DockerContainerRun.Result
|
||||
)
|
42
scone/default/utensils/docker_utensils.py
Normal file
42
scone/default/utensils/docker_utensils.py
Normal file
@ -0,0 +1,42 @@
|
||||
import attr
|
||||
import docker.errors
|
||||
|
||||
from scone.common.chanpro import Channel
|
||||
from scone.sous import Utensil
|
||||
from scone.sous.utensils import Worktop
|
||||
|
||||
_docker_client_instance = None
|
||||
|
||||
|
||||
def _docker_client():
|
||||
global _docker_client_instance
|
||||
if not _docker_client_instance:
|
||||
_docker_client_instance = docker.from_env()
|
||||
return _docker_client_instance
|
||||
|
||||
|
||||
@attr.s(auto_attribs=True)
|
||||
class DockerContainerRun(Utensil):
|
||||
image: str
|
||||
command: str
|
||||
|
||||
@attr.s(auto_attribs=True)
|
||||
class Result:
|
||||
name: str
|
||||
|
||||
async def execute(self, channel: Channel, worktop: Worktop):
|
||||
try:
|
||||
container = _docker_client().containers.run(
|
||||
self.image, self.command, detach=True
|
||||
)
|
||||
|
||||
except docker.errors.ImageNotFound:
|
||||
# specified image does not exist (or requires login)
|
||||
await channel.send(None)
|
||||
return
|
||||
except docker.errors.APIError:
|
||||
# the docker server returned an error
|
||||
await channel.send(None)
|
||||
return
|
||||
|
||||
await channel.send(DockerContainerRun.Result(name=container.name))
|
Loading…
Reference in New Issue
Block a user