mirror of
https://github.com/jupyter/docker-stacks.git
synced 2025-10-08 10:34:06 +00:00
Add docker_runner, new versioned tags, fix images order and actually apply tags
This commit is contained in:
@@ -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
29
tagging/docker_runner.py
Normal 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")
|
@@ -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"
|
||||||
|
Reference in New Issue
Block a user