Source code for galaxy.tool_util.deps.dockerfiles

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__)


[docs]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"], )
[docs]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