Add docker_runner, new versioned tags, fix images order and actually apply tags

This commit is contained in:
Ayaz Salikhov
2021-03-22 00:42:00 +03:00
parent 4376da031e
commit aa2b3645e2
3 changed files with 84 additions and 25 deletions

View File

@@ -6,15 +6,12 @@ import logging
from tagger_interface import TaggerInterface from tagger_interface import TaggerInterface
from dataclasses import dataclass, field from dataclasses import dataclass, field
from typing import Optional, List from typing import Optional, List
from taggers import SHATagger, PythonVersionTagger from taggers import SHATagger, \
PythonVersionTagger, JupyterNotebookVersionTagger, JupyterLabVersionTagger, JupyterHubVersionTagger
from plumbum.cmd import docker
# NB_VERSION_TAG="notebook-$(docker run --rm -a STDOUT ${IMAGE_NAME} jupyter-notebook --version | tr -d '\r')" logger = logging.getLogger(__name__)
# docker tag $IMAGE_NAME "$DOCKER_REPO:${NB_VERSION_TAG%% }"
# LAB_VERSION_TAG="lab-$(docker run --rm -a STDOUT ${IMAGE_NAME} jupyter-lab --version | tr -d '\r')"
# docker tag $IMAGE_NAME "$DOCKER_REPO:${LAB_VERSION_TAG%%\r}"
# HUB_VERSION_TAG="hub-$(docker run --rm -a STDOUT ${IMAGE_NAME} jupyterhub --version | tr -d '\r')"
# docker tag $IMAGE_NAME "$DOCKER_REPO:${HUB_VERSION_TAG%%\r}"
@dataclass @dataclass
@@ -24,13 +21,16 @@ class ImageDescription:
ALL_IMAGES = { ALL_IMAGES = {
"minimal-notebook": ImageDescription(
parent_image=None,
taggers=[SHATagger]
),
"base-notebook": ImageDescription( "base-notebook": ImageDescription(
parent_image="minimal-notebook", parent_image=None,
taggers=[PythonVersionTagger] taggers=[
SHATagger,
PythonVersionTagger, JupyterNotebookVersionTagger, JupyterLabVersionTagger, JupyterHubVersionTagger
]
),
"minimal-notebook": ImageDescription(
parent_image="base-notebook",
taggers=[]
) )
} }
@@ -45,12 +45,13 @@ def get_all_taggers(short_image_name):
def apply_tags(short_image_name, owner): def apply_tags(short_image_name, owner):
logging.info(f"Applying tags for image: {short_image_name}") logger.info(f"Applying tags for image: {short_image_name}")
taggers = get_all_taggers(short_image_name) taggers = get_all_taggers(short_image_name)
for tagger in taggers: for tagger in taggers:
tag_name, tag_value = tagger.tag_name(), tagger.tag_value(short_image_name, owner) tag_name, tag_value = tagger.tag_name(), tagger.tag_value(short_image_name, owner)
logging.info(f"Applying tag tag_name: {tag_name} tag_value: {tag_value}") logger.info(f"Applying tag tag_name: {tag_name} tag_value: {tag_value}")
docker["tag", f"{owner}/{short_image_name}:latest", f"{owner}/{short_image_name}:{tag_value}"]()
if __name__ == "__main__": if __name__ == "__main__":

29
tagging/docker_runner.py Normal file
View File

@@ -0,0 +1,29 @@
# Copyright (c) Jupyter Development Team.
# Distributed under the terms of the Modified BSD License.
import docker
import logging
logger = logging.getLogger(__name__)
class DockerRunner:
def __init__(self, image_name, docker_client=docker.from_env(), command="sleep infinity"):
self.container = None
self.image_name = image_name
self.command = command
self.docker_client = docker_client
def __enter__(self):
logger.info(f"Creating container for image {self.image_name} ...")
self.container = self.docker_client.containers.run(
image=self.image_name, command=self.command, detach=True,
)
logger.info(f"Container {self.container.name} created")
return self.container
def __exit__(self, exc_type, exc_value, traceback):
logger.info(f"Removing container {self.container.name} ...")
if self.container:
self.container.remove(force=True)
logger.info(f"Container {self.container.name} removed")

View File

@@ -1,22 +1,21 @@
# Copyright (c) Jupyter Development Team. # Copyright (c) Jupyter Development Team.
# Distributed under the terms of the Modified BSD License. # Distributed under the terms of the Modified BSD License.
import logging
from tagger_interface import TaggerInterface from tagger_interface import TaggerInterface
from git_helper import GitHelper from git_helper import GitHelper
from plumbum.cmd import docker from docker_runner import DockerRunner
def _get_full_name(short_image_name, owner): logger = logging.getLogger(__name__)
return f"{owner}/{short_image_name}:latest"
def _get_program_version(short_image_name, owner, program): def _get_program_version(short_image_name, owner, program):
return docker[ image = f"{owner}/{short_image_name}:latest"
"run", cmd = f"{program} --version"
"--rm", with DockerRunner(image) as cont:
"-a", "STDOUT", logger.info(f"Running cmd: '{cmd}' on image: {image}")
_get_full_name(short_image_name, owner), # exit code doesn't have to be 0, so we won't check it
program, "--version" return cont.exec_run(cmd).output.decode("utf-8").strip()
]().strip()
class SHATagger(TaggerInterface): class SHATagger(TaggerInterface):
@@ -37,3 +36,33 @@ class PythonVersionTagger(TaggerInterface):
@staticmethod @staticmethod
def tag_name(): def tag_name():
return "python_version" return "python_version"
class JupyterNotebookVersionTagger(TaggerInterface):
@staticmethod
def tag_value(short_image_name, owner):
return "notebook-" + _get_program_version(short_image_name, owner, "jupyter-notebook")
@staticmethod
def tag_name():
return "jupyter_notebook_version"
class JupyterLabVersionTagger(TaggerInterface):
@staticmethod
def tag_value(short_image_name, owner):
return "lab-" + _get_program_version(short_image_name, owner, "jupyter-lab")
@staticmethod
def tag_name():
return "jupyter_lab_version"
class JupyterHubVersionTagger(TaggerInterface):
@staticmethod
def tag_value(short_image_name, owner):
return "hub-" + _get_program_version(short_image_name, owner, "jupyterhub")
@staticmethod
def tag_name():
return "jupyter_lab_version"