From 0610edfc20977cfa60f400433700ce874f6ce927 Mon Sep 17 00:00:00 2001 From: Simon Li Date: Tue, 11 Feb 2020 18:07:16 +0000 Subject: [PATCH] Add docker implementation of abstract engine --- repo2docker/docker.py | 107 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 repo2docker/docker.py diff --git a/repo2docker/docker.py b/repo2docker/docker.py new file mode 100644 index 00000000..b6ec041d --- /dev/null +++ b/repo2docker/docker.py @@ -0,0 +1,107 @@ +""" +Docker container engine for repo2docker +""" + +import docker +from .engine import Container, ContainerEngine, ContainerEngineException + + +class DockerContainer(Container): + def __init__(self, container): + self._c = container + + def reload(self): + return self._c.reload() + + def logs(self, stream=False): + return self._c.logs(stream=stream) + + def kill(self, *, signal="KILL"): + return self._c.kill(signal=signal) + + def remove(self): + return self._c.remove() + + def stop(self, *, timeout=10): + return self._c.stop(timeout=timeout) + + @property + def status(self): + return self._c.status + + +class DockerEngine(ContainerEngine): + """ + https://docker-py.readthedocs.io/en/4.2.0/api.html#module-docker.api.build + """ + + def __init__(self): + try: + self._apiclient = docker.APIClient( + version="auto", **docker.utils.kwargs_from_env() + ) + self._client = docker.from_env(version="auto") + except docker.errors.DockerException as e: + raise ContainerEngineException(e) + + def build( + self, + *, + buildargs=None, + cache_from=None, + container_limits=None, + forcerm=False, + rm=False, + tag="", + custom_context=False, + decode=False, + dockerfile="", + fileobj=None, + path="", + ): + return self._apiclient.build( + buildargs=buildargs, + cache_from=cache_from, + container_limits=container_limits, + forcerm=forcerm, + rm=rm, + tag=tag, + custom_context=custom_context, + decode=decode, + dockerfile=dockerfile, + fileobj=fileobj, + path=path, + ) + + def images(self): + return self._apiclient.images() + + def inspect_image(self, image): + return self._apiclient.inspect_image(image) + + def push(self, image_spec, *, stream=True): + return self._apiclient.push(image_spec, stream=stream) + + def run( + self, + image_spec, + *, + command=None, + environment=None, + detach=False, + ports=None, + publish_all_ports=False, + remove=False, + volumes=None, + ): + container = self._client.containers.run( + image_spec, + command=command, + environment=(environment or []), + detach=detach, + ports=(ports or {}), + publish_all_ports=publish_all_ports, + remove=remove, + volumes=(volumes or {}), + ) + return DockerContainer(container)