diff env/lib/python3.9/site-packages/galaxy/tool_util/deps/dockerfiles.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/dockerfiles.py	Mon Mar 22 18:12:50 2021 +0000
@@ -0,0 +1,75 @@
+import logging
+import os
+
+from galaxy.tool_util.deps import docker_util
+from galaxy.tool_util.deps.container_classes import docker_cache_path
+from galaxy.tool_util.deps.requirements import parse_requirements_from_xml
+from galaxy.tool_util.loader_directory import load_tool_elements_from_path
+from galaxy.util import commands
+
+log = logging.getLogger(__name__)
+
+
+def docker_host_args(**kwds):
+    return dict(
+        docker_cmd=kwds["docker_cmd"],
+        sudo=kwds["docker_sudo"],
+        sudo_cmd=kwds["docker_sudo_cmd"],
+        host=kwds["docker_host"]
+    )
+
+
+def dockerfile_build(path, dockerfile=None, error=log.error, **kwds):
+    expected_container_names = set()
+    tool_directories = set()
+    for (tool_path, tool_xml) in load_tool_elements_from_path(path):
+        requirements, containers = parse_requirements_from_xml(tool_xml)
+        for container in containers:
+            if container.type == "docker":
+                expected_container_names.add(container.identifier)
+                tool_directories.add(os.path.dirname(tool_path))
+                break
+
+    if len(expected_container_names) == 0:
+        error("Could not find any docker identifiers to generate.")
+
+    if len(expected_container_names) > 1:
+        error("Multiple different docker identifiers found for selected tools [%s]", expected_container_names)
+
+    image_identifier = expected_container_names.pop()
+
+    dockerfile = __find_dockerfile(dockerfile, tool_directories)
+    if dockerfile is not None:
+        docker_command_parts = docker_util.build_command(
+            image_identifier,
+            dockerfile,
+            **docker_host_args(**kwds)
+        )
+    else:
+        docker_command_parts = docker_util.build_pull_command(image_identifier, **docker_host_args(**kwds))
+        commands.execute(docker_command_parts)
+
+    commands.execute(docker_command_parts)
+    docker_image_cache = kwds['docker_image_cache']
+    if docker_image_cache:
+        destination = docker_cache_path(docker_image_cache, image_identifier)
+        save_image_command_parts = docker_util.build_save_image_command(
+            image_identifier,
+            destination,
+            **docker_host_args(**kwds)
+        )
+        commands.execute(save_image_command_parts)
+
+
+def __find_dockerfile(dockerfile, tool_directories):
+    if dockerfile is not None:
+        return dockerfile
+    search_directories = ["."]
+    if len(tool_directories) == 1:
+        tool_directory = tool_directories.pop()
+        search_directories.insert(0, tool_directory)
+    for directory in search_directories:
+        potential_dockerfile = os.path.join(directory, "Dockerfile")
+        if os.path.exists(potential_dockerfile):
+            return potential_dockerfile
+    return None