Warning
This document is for an old release of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.
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