diff env/lib/python3.9/site-packages/galaxy/tool_util/deps/docker_util.py @ 0:4f3585e2f14b draft default tip

"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author shellac
date Mon, 22 Mar 2021 18:12:50 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/env/lib/python3.9/site-packages/galaxy/tool_util/deps/docker_util.py	Mon Mar 22 18:12:50 2021 +0000
@@ -0,0 +1,243 @@
+"""Utilities for building up Docker commands...
+
+...using common defaults and configuration mechanisms.
+"""
+import os
+import shlex
+
+from galaxy.util.commands import argv_to_str
+
+DEFAULT_DOCKER_COMMAND = "docker"
+DEFAULT_SUDO = False
+DEFAULT_SUDO_COMMAND = "sudo"
+DEFAULT_HOST = None
+DEFAULT_VOLUME_MOUNT_TYPE = "rw"
+DEFAULT_WORKING_DIRECTORY = None
+DEFAULT_NET = None
+DEFAULT_MEMORY = None
+DEFAULT_VOLUMES_FROM = None
+DEFAULT_AUTO_REMOVE = True
+DEFAULT_SET_USER = "$UID"
+DEFAULT_RUN_EXTRA_ARGUMENTS = None
+
+
+def kill_command(
+    container,
+    signal=None,
+    **kwds
+):
+    args = (["-s", signal] if signal else []) + [container]
+    return command_list("kill", args, **kwds)
+
+
+def logs_command(
+    container,
+    **kwds
+):
+    return command_list("logs", [container], **kwds)
+
+
+def build_command(
+    image,
+    docker_build_path,
+    **kwds
+):
+    if os.path.isfile(docker_build_path):
+        docker_build_path = os.path.dirname(os.path.abspath(docker_build_path))
+    return command_list("build", ["-t", image, docker_build_path], **kwds)
+
+
+def build_save_image_command(
+    image,
+    destination,
+    **kwds
+):
+    return command_list("save", ["-o", destination, image], **kwds)
+
+
+def build_pull_command(
+    tag,
+    **kwds
+):
+    return command_list("pull", [tag], **kwds)
+
+
+def build_docker_cache_command(
+    image,
+    **kwds
+):
+    inspect_image_command = command_shell("inspect", [image], **kwds)
+    pull_image_command = command_shell("pull", [image], **kwds)
+    cache_command = f"{inspect_image_command} > /dev/null 2>&1\n[ $? -ne 0 ] && {pull_image_command} > /dev/null 2>&1\n"
+    return cache_command
+
+
+def build_docker_images_command(truncate=True, **kwds):
+    args = ["--no-trunc"] if not truncate else[]
+    return command_shell("images", args, **kwds)
+
+
+def build_docker_load_command(**kwds):
+    return command_shell("load", [])
+
+
+def build_docker_simple_command(
+    command,
+    docker_cmd=DEFAULT_DOCKER_COMMAND,
+    sudo=DEFAULT_SUDO,
+    sudo_cmd=DEFAULT_SUDO_COMMAND,
+    container_name=None,
+    **kwd
+):
+    command_parts = _docker_prefix(
+        docker_cmd=docker_cmd,
+        sudo=sudo,
+        sudo_cmd=sudo_cmd,
+    )
+    command_parts.append(command)
+    command_parts.append(container_name or '{CONTAINER_NAME}')
+    return " ".join(command_parts)
+
+
+def build_docker_run_command(
+    container_command,
+    image,
+    interactive=False,
+    terminal=False,
+    tag=None,
+    volumes=None,
+    volumes_from=DEFAULT_VOLUMES_FROM,
+    memory=DEFAULT_MEMORY,
+    env_directives=None,
+    working_directory=DEFAULT_WORKING_DIRECTORY,
+    name=None,
+    net=DEFAULT_NET,
+    run_extra_arguments=DEFAULT_RUN_EXTRA_ARGUMENTS,
+    docker_cmd=DEFAULT_DOCKER_COMMAND,
+    sudo=DEFAULT_SUDO,
+    sudo_cmd=DEFAULT_SUDO_COMMAND,
+    auto_rm=DEFAULT_AUTO_REMOVE,
+    set_user=DEFAULT_SET_USER,
+    host=DEFAULT_HOST,
+    guest_ports=False,
+    container_name=None
+):
+    env_directives = env_directives or []
+    volumes = volumes or []
+    command_parts = _docker_prefix(
+        docker_cmd=docker_cmd,
+        sudo=sudo,
+        sudo_cmd=sudo_cmd,
+        host=host
+    )
+    command_parts.append("run")
+    if interactive:
+        command_parts.append("-i")
+    if terminal:
+        command_parts.append("-t")
+    for env_directive in env_directives:
+        # e.g. -e "GALAXY_SLOTS=$GALAXY_SLOTS"
+        # These are environment variable expansions so we don't quote these.
+        command_parts.extend(["-e", env_directive])
+    if guest_ports is True:
+        # When is True, expose all ports
+        command_parts.append("-P")
+    elif guest_ports:
+        if not isinstance(guest_ports, list):
+            guest_ports = [guest_ports]
+        for guest_port in guest_ports:
+            command_parts.extend(["-p", guest_port])
+    if container_name:
+        command_parts.extend(["--name", container_name])
+    for volume in volumes:
+        command_parts.extend(["-v", str(volume)])
+    if volumes_from:
+        command_parts.extend(["--volumes-from", shlex.quote(str(volumes_from))])
+    if memory:
+        command_parts.extend(["-m", shlex.quote(memory)])
+    command_parts.extend(["--cpus", '${GALAXY_SLOTS:-1}'])
+    if name:
+        command_parts.extend(["--name", shlex.quote(name)])
+    if working_directory:
+        command_parts.extend(["-w", shlex.quote(working_directory)])
+    if net:
+        command_parts.extend(["--net", shlex.quote(net)])
+    if auto_rm:
+        command_parts.append("--rm")
+    if run_extra_arguments:
+        command_parts.append(run_extra_arguments)
+    if set_user:
+        user = set_user
+        if set_user == DEFAULT_SET_USER:
+            # If future-us is ever in here and fixing this for docker-machine just
+            # use cwltool.docker_id - it takes care of this default nicely.
+            euid = os.geteuid()
+            egid = os.getgid()
+
+            user = "%d:%d" % (euid, egid)
+        command_parts.extend(["--user", user])
+    full_image = image
+    if tag:
+        full_image = f"{full_image}:{tag}"
+    command_parts.append(shlex.quote(full_image))
+    command_parts.append(container_command)
+    return " ".join(command_parts)
+
+
+def command_list(command, command_args=None, **kwds):
+    """Return Docker command as an argv list."""
+    command_args = command_args or []
+    command_parts = _docker_prefix(**kwds)
+    command_parts.append(command)
+    command_parts.extend(command_args)
+    return command_parts
+
+
+def command_shell(command, command_args=None, **kwds):
+    """Return Docker command as a string for a shell or command-list."""
+    command_args = command_args or []
+    cmd = command_list(command, command_args, **kwds)
+    to_str = kwds.get("to_str", True)
+    if to_str:
+        return argv_to_str(cmd)
+    else:
+        return cmd
+
+
+def _docker_prefix(
+    docker_cmd=DEFAULT_DOCKER_COMMAND,
+    sudo=DEFAULT_SUDO,
+    sudo_cmd=DEFAULT_SUDO_COMMAND,
+    host=DEFAULT_HOST,
+    **kwds
+):
+    """Prefix to issue a docker command."""
+    command_parts = []
+    if sudo:
+        command_parts.append(sudo_cmd)
+    command_parts.append(docker_cmd)
+    if host:
+        command_parts.extend(["-H", host])
+    return command_parts
+
+
+def parse_port_text(port_text):
+    """
+
+    >>> slurm_ports = parse_port_text("8888/tcp -> 0.0.0.0:32769")
+    >>> slurm_ports[8888]['host']
+    '0.0.0.0'
+    """
+    ports = None
+    if port_text is not None:
+        ports = {}
+        for line in port_text.strip().split('\n'):
+            if " -> " not in line:
+                raise Exception("Cannot parse host and port from line [%s]" % line)
+            tool, host = line.split(" -> ", 1)
+            hostname, port = host.split(':')
+            port = int(port)
+            tool_p, tool_prot = tool.split("/")
+            tool_p = int(tool_p)
+            ports[tool_p] = dict(tool_port=tool_p, host=hostname, port=port, protocol=tool_prot)
+    return ports