From c24fad522e4a98c1e3a7901d873e1923d4fa7667 Mon Sep 17 00:00:00 2001 From: Merikei <73759842+Merikei@users.noreply.github.com> Date: Sat, 31 Oct 2020 21:34:05 +0000 Subject: [PATCH] Add initial docker-container support (#7) * Initial docker-container support * lint --- scone/default/recipes/docker.py | 20 +++++++++++ scone/default/utensils/docker_utensils.py | 42 +++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 scone/default/recipes/docker.py create mode 100644 scone/default/utensils/docker_utensils.py diff --git a/scone/default/recipes/docker.py b/scone/default/recipes/docker.py new file mode 100644 index 0000000..60aab27 --- /dev/null +++ b/scone/default/recipes/docker.py @@ -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 + ) diff --git a/scone/default/utensils/docker_utensils.py b/scone/default/utensils/docker_utensils.py new file mode 100644 index 0000000..0fa6aff --- /dev/null +++ b/scone/default/utensils/docker_utensils.py @@ -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))