# Stage 1: # - base: ubuntu (default) OR prebuilt image0 # - install build tools # - clone playbook # - run playbook # - remove build artifacts + files not needed in container # Stage 2: # - create galaxy user + group + directory # - copy galaxy files from stage 2.1 and 2.2 # - finalize container (set path, user...) # Init ARGs ARG ROOT_DIR=/galaxy ARG SERVER_DIR=$ROOT_DIR/server ARG STAGE1_BASE=python:3.12-slim ARG FINAL_STAGE_BASE=$STAGE1_BASE ARG GALAXY_USER=galaxy ARG GALAXY_PLAYBOOK_REPO=https://github.com/galaxyproject/galaxy-docker-k8s ARG GALAXY_PLAYBOOK_BRANCH=v4.2.0 ARG GIT_COMMIT=unspecified ARG BUILD_DATE=unspecified ARG IMAGE_TAG=unspecified #====================================================== # Stage 1 - Run playbook #====================================================== FROM $STAGE1_BASE AS stage1 ARG DEBIAN_FRONTEND=noninteractive ARG SERVER_DIR ARG GALAXY_PLAYBOOK_REPO ARG GALAXY_PLAYBOOK_BRANCH # Init Env ENV LC_ALL=en_US.UTF-8 ENV LANG=en_US.UTF-8 # Install build dependencies + ansible RUN set -xe; \ echo "Acquire::http {No-Cache=True;};" > /etc/apt/apt.conf.d/no-cache \ && apt-get -qq update && apt-get install -y --no-install-recommends \ locales locales-all \ git \ make \ libc-dev \ bzip2 \ gcc \ && pip install --no-cache virtualenv ansible==11.11.0 \ && apt-get autoremove -y && apt-get clean \ && rm -rf /var/lib/apt/lists/* /tmp/* # Remove context from previous build; copy current context; run playbook WORKDIR /tmp/ansible RUN rm -rf * # Add Galaxy source code COPY . $SERVER_DIR/ RUN git clone --depth 1 --branch $GALAXY_PLAYBOOK_BRANCH $GALAXY_PLAYBOOK_REPO galaxy-docker WORKDIR /tmp/ansible/galaxy-docker RUN ansible-galaxy install -r requirements.yml -p roles --force-with-deps RUN ansible-playbook -i localhost, playbook.yml -v -e galaxy_virtualenv_command=virtualenv # Remove build artifacts + files not needed in container WORKDIR $SERVER_DIR # Save commit hash of HEAD before zapping git folder RUN git rev-parse HEAD > GITREVISION RUN rm -rf \ .ci \ .git \ .venv/include/node \ .venv/src/node* \ client/dist \ doc \ test \ test-data # Clean up *all* node_modules, including plugins. Everything is already built+staged. RUN find . -name "node_modules" -type d -prune -exec rm -rf '{}' + # Remove pre-built visualization plugin static files (not present in base image, ~220MB) RUN find config/plugins/visualizations -mindepth 2 -maxdepth 2 -name "static" -type d -exec rm -rf '{}' + #====================================================== # Stage 2 - Build final image based on previous stage #====================================================== FROM $FINAL_STAGE_BASE ARG DEBIAN_FRONTEND=noninteractive ARG ROOT_DIR ARG SERVER_DIR ARG GALAXY_USER ARG GIT_COMMIT ARG BUILD_DATE ARG IMAGE_TAG LABEL org.opencontainers.image.title="Galaxy Minimal Image" \ org.opencontainers.image.description="A size optimized image for Galaxy targeting k8s and ci applications" \ org.opencontainers.image.authors="galaxyproject.org" \ org.opencontainers.image.vendor="Galaxy Project" \ org.opencontainers.image.documentation="https://github.com/galaxyproject/galaxy-docker-k8s" \ org.opencontainers.image.licenses="MIT" \ org.opencontainers.image.version="$IMAGE_TAG" \ org.opencontainers.image.url="https://github.com/galaxyproject/galaxy-docker-k8s" \ org.opencontainers.image.source="https://github.com/galaxyproject/galaxy.git" \ org.opencontainers.image.revision=$GIT_COMMIT \ org.opencontainers.image.created=$BUILD_DATE # Init Env ENV LC_ALL=en_US.UTF-8 ENV LANG=en_US.UTF-8 # Install procps (contains kill, ps etc.), less, curl, vim-tiny and nano-tiny # for convenience and debugging purposes. Nano and vim commands are aliased # to their tiny variants using the debian alternatives system. # Bzip2 and virtualenv are installed for backwards compatibility with older # versions of this image which was based on Ubuntu and contained these # utilities. RUN set -xe; \ echo "Acquire::http {No-Cache=True;};" > /etc/apt/apt.conf.d/no-cache \ && apt-get -qq update && apt-get install -y --no-install-recommends \ locales \ vim-tiny \ nano-tiny \ netcat-openbsd \ curl \ procps \ less \ bzip2 \ tini \ wget \ && update-alternatives --install /usr/bin/nano nano /bin/nano-tiny 0 \ && update-alternatives --install /usr/bin/vim vim /usr/bin/vim.tiny 0 \ && echo "set nocompatible\nset backspace=indent,eol,start" >> /usr/share/vim/vimrc.tiny \ && echo "$LANG UTF-8" > /etc/locale.gen \ && locale-gen $LANG && update-locale LANG=$LANG \ && curl -L https://github.com/galaxyproject/gxadmin/releases/latest/download/gxadmin > /usr/bin/gxadmin \ && chmod +x /usr/bin/gxadmin \ && apt-get autoremove -y && apt-get clean \ && rm -rf /var/lib/apt/lists/* /tmp/* # Create Galaxy user, group, directory; chown RUN set -xe; \ adduser --system --group --uid 10001 $GALAXY_USER \ && mkdir -p $SERVER_DIR \ && chown $GALAXY_USER:$GALAXY_USER $ROOT_DIR -R WORKDIR $ROOT_DIR # Copy galaxy files to final image # The chown value MUST be hardcoded (see https://github.com/moby/moby/issues/35018) COPY --chown=$GALAXY_USER:$GALAXY_USER --from=stage1 $ROOT_DIR . WORKDIR $SERVER_DIR # The data in version.json will be displayed in Galaxy's /api/version endpoint RUN printf "{\n \"git_commit\": \"$(cat GITREVISION)\",\n \"build_date\": \"$BUILD_DATE\",\n \"image_tag\": \"$IMAGE_TAG\"\n}\n" > version.json \ && chown $GALAXY_USER:$GALAXY_USER version.json EXPOSE 8080 USER $GALAXY_USER ENV PATH="$SERVER_DIR/.venv/bin:${PATH}" ENV GALAXY_CONFIG_CONDA_AUTO_INIT=False ENTRYPOINT ["tini", "--"] # [optional] to run: CMD ["galaxy"]