Warning

This document is for an in-development version 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.

Containerized metadata collection

Galaxy can run the metadata step after a tool in a separate container containing galaxy-set-metadata. Enable it per job destination with metadata_config. The tool’s container and its dependencies are independent of the metadata image. This feature must be present in your Galaxy server checkout; installing a newer runtime image does not add it to an older server.

When to use it

A metadata image gives execution hosts a consistent Python, Galaxy datatype implementation, and dependency set without installing Galaxy’s virtualenv on every worker. It also lets Pulsar compute metadata remotely without sharing the Galaxy installation. Pinning the image digest makes that environment repeatable and lets you roll it back independently of worker configuration.

The costs are another container startup per job, image distribution and cache space on workers, and responsibility for maintaining a runtime that matches the server. Small jobs may spend a noticeable fraction of their time starting the metadata container. Custom datatypes and optional dependencies need to be installed in this image as well as on the server where applicable. An image is not a substitute for configuring output transfer, object-store access, or the container engine on the execution host.

Choose a compatible image

Use the same Galaxy release as the server, including the patch release where possible. Metadata files and serialized model objects are internal interfaces; compatibility between different Galaxy releases is not guaranteed. For a modified checkout or development branch, build the runtime from that checkout. Do not use the latest stable runtime with a newer development server merely because the image builds successfully.

The default image is quay.io/galaxyproject/galaxy-job-execution:<galaxy.version.VERSION>. There is no implicit latest tag. Set metadata_config.image explicitly to use a locally built image, a private registry, a custom variant, or a digest. The synthetic metadata tool’s profile follows galaxy.version.VERSION_MAJOR; it controls tool compatibility behavior, not which Galaxy packages are installed.

The Dockerfile’s release build currently defaults to Galaxy 26.1.1 and Python 3.14.7 on Debian trixie. The Python image can be overridden with a trixie-compatible PYTHON_IMAGE. Both build and runtime stages use the same base to avoid Python or native-library ABI mismatches. The supplied publishing workflow initially builds linux/amd64; other architectures require a separately built and validated image.

Before enabling a destination, build the image or verify that its tag has been published and is accessible from the execution host. Registry publication is a separate step from merging this feature.

Configure a destination

For a local or shared-filesystem cluster destination in job_conf.yml:

runners:
  local:
    load: galaxy.jobs.runners.local:LocalJobRunner
execution:
  default: metadata_docker
  environments:
    metadata_docker:
      runner: local
      docker_enabled: true
      outputs_to_working_directory: true
      metadata_strategy: extended
      metadata_config:
        containerize: true
        engine: docker
        image: quay.io/galaxyproject/galaxy-job-execution:26.1.1

Replace the example release with the version matching your server. Prefer the registry’s image@sha256:<digest> reference once you have validated an image. The engine must be available on the execution host. For Singularity, use engine: singularity, enable singularity_enabled on the destination, and provide an image reference supported by your configured container resolver, for example a prebuilt SIF available on that host.

Metadata uses the destination’s container resolver configuration. Keep the explicit-container resolver enabled and avoid destination-wide tool-image overrides such as container_override or docker_container_id_override: these take precedence over the explicit metadata image too. Verify the selected image in the job command when validating a destination.

For an existing Pulsar destination without shared Galaxy storage, add:

remote_metadata: true
metadata_strategy: directory
default_file_action: copy
metadata_config:
  containerize: true
  engine: docker
  image: quay.io/galaxyproject/galaxy-job-execution:26.1.1

Keep the runner’s existing connection and container configuration. directory metadata returns datasets, composite extra files, and metadata through Pulsar’s staging machinery. Container paths refer to the remote job directory, not to Galaxy’s local filesystem. This configuration does not require sharing Galaxy’s object-store directory with Pulsar.

extended metadata instead writes outputs to the configured object store from the execution host and returns the populated model store. Only use it remotely when that object store is deliberately accessible there, with the required credentials, networking and, for a disk store, explicitly configured mounts. Turning on containerized metadata does not supply those resources or make Galaxy’s disk paths available remotely.

Build a release or checkout image

Run builds from the repository root. A stable release build installs the Galaxy package dependency closure at the requested version, rather than mixing a pinned job-execution package with newer unpinned Galaxy packages:

docker build -f packages/job_execution/Dockerfile \
  --build-arg GALAXY_VERSION=26.1.1 \
  -t registry.example.org/galaxy-metadata:26.1.1 .

To build this checkout, including uncommitted development changes:

version=$(PYTHONPATH=lib python3 -c 'from galaxy.version import VERSION; print(VERSION)')
revision=$(git rev-parse HEAD)
docker build -f packages/job_execution/Dockerfile \
  --build-arg RUNTIME_SOURCE=source \
  --build-arg GALAXY_VERSION="$version" \
  --build-arg GIT_COMMIT="$revision" \
  --build-arg BUILD_DATE="$(date -u +'%Y-%m-%dT%H:%M:%SZ')" \
  -t registry.example.org/galaxy-metadata:site-test .

GALAXY_VERSION labels a source build; it does not change the checked-out code. Use a clean, recorded commit for production builds. Push the tested image to your registry, obtain its digest, and set that reference in metadata_config. For offline sites, distribute the image to workers before scheduling jobs.

Builds run pip check and import the metadata entry point, pysam and h5py in the final runtime. They also record installed Python versions in /etc/galaxy/requirements.txt. These checks detect packaging problems; they do not prove that every configured datatype can collect metadata.

Optional dependencies and custom datatypes

The standard image includes the declared galaxy-data Python dependencies (including pysam and h5py) and the S3, Azure Blob and iRODS object-store clients. It does not attempt to include every optional datatype executable, site plugin or file-source backend. Tool requirements, host Conda environments and the tool container are not automatically inherited by the metadata container. There is no automatic per-datatype dependency installation at job runtime.

Build a site image containing the dependencies required by your enabled datatypes. For example, media datatypes use ffprobe when available; without it, some metadata can remain unset without failing the job. A site image supporting those formats could include:

FROM registry.example.org/galaxy-metadata:26.1.1
RUN apt-get update && apt-get install -y --no-install-recommends ffmpeg \
    && rm -rf /var/lib/apt/lists/*
RUN ffprobe -version
COPY requirements-metadata.txt /tmp/requirements-metadata.txt
RUN python -m pip install --no-cache-dir \
        -c /etc/galaxy/requirements.txt -r /tmp/requirements-metadata.txt \
    && python -m pip check

Use a digest in FROM for production. Supply your own pinned requirements-metadata.txt for additional Python dependencies. The constraints prevent installation from silently replacing the base Galaxy runtime or its existing dependencies. If dependencies conflict, rebuild and validate a compatible base rather than removing the constraint without checking the effect. Native extensions may require extra build tools and runtime libraries; these must be provided in the custom Dockerfile.

Install custom datatype Python modules in the image under the same import paths used by the server’s datatype registry. The registry configuration is supplied with the job; it is not an installer for the Python modules or their libraries. Keep the server and image implementations in sync. Do not copy server secrets into the image. Use normal job destination and storage configuration for runtime credentials.

You can maintain different metadata images for different destinations and route tools accordingly. Record your site variant and image build revision in the tag, for example 26.1.1-media-r1, and pin the resulting digest in production.

Validate and diagnose

Test representative jobs for every enabled datatype, including nonempty data, composite outputs with nested files, and metadata files such as BAM indexes. Check the resulting metadata values, not only the final job state: some datatype implementations tolerate missing optional libraries or executables.

When metadata_config.containerize is enabled, failing to resolve a container is a configuration error; Galaxy does not silently construct a host metadata command. Check that the requested engine is enabled on the destination and that its container resolvers can resolve the image.

During validation, set retry_metadata_internally: false in galaxy.yml so that server-side metadata fallback cannot conceal a failing remote runtime. Decide whether to retain that setting in production; fallback can keep jobs usable, but needs dependencies on the server and moves work back to it.

Inspect job stderr and the job’s metadata results for missing imports, executables, and inaccessible paths. A disk object-store permission error on Pulsar is a reason to check the metadata strategy and transfer configuration, not to mount Galaxy’s entire storage into every remote container.

Image versions and updates

Official images use a moving Galaxy-version alias (for example 26.1.1 or 26.2.dev0) and a unique build tag <version>-r<workflow-run-number>.<attempt>. Pin a digest for deployment: a version alias can advance after rebuilds. Images record the Galaxy version, source revision and build date in OCI labels, and include the installed Python package manifest in /etc/galaxy/requirements.txt.

A pinned Galaxy version alone does not make successive builds byte-identical: base images, OS packages and other Python dependencies can change. Validate updates with representative jobs, retain the previous digest for rollback, and update deployment references deliberately. Do not silently substitute a new Galaxy release in an existing server deployment.

The developer guide describes how maintainers publish official images and update the stable runtime defaults.