123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- # syntax=docker/dockerfile:1.7
- # Please see https://docs.docker.com/engine/reference/builder for information about
- # the extended buildx capabilities used in this file.
- # Make sure multiarch TARGETPLATFORM is available for interpolation
- # See: https://docs.docker.com/build/building/multi-platform/
- ARG TARGETPLATFORM=${TARGETPLATFORM}
- ARG BUILDPLATFORM=${BUILDPLATFORM}
- # Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
- ARG NODE_MAJOR_VERSION="20"
- # Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="bookworm"]
- ARG DEBIAN_VERSION="bookworm"
- # Node image to use for base image based on combined variables (ex: 20-bookworm-slim)
- FROM docker.io/node:${NODE_MAJOR_VERSION}-${DEBIAN_VERSION}-slim as streaming
- # Timezone used by the Docker container and runtime, change with [--build-arg TZ=Europe/Berlin]
- ARG TZ="Etc/UTC"
- # Linux UID (user id) for the mastodon user, change with [--build-arg UID=1234]
- ARG UID="991"
- # Linux GID (group id) for the mastodon user, change with [--build-arg GID=1234]
- ARG GID="991"
- # Apply Mastodon build options based on options above
- ENV \
- # Apply Mastodon version information
- MASTODON_VERSION_PRERELEASE="${MASTODON_VERSION_PRERELEASE}" \
- MASTODON_VERSION_METADATA="${MASTODON_VERSION_METADATA}" \
- # Apply timezone
- TZ=${TZ}
- ENV \
- # Configure the IP to bind Mastodon to when serving traffic
- BIND="0.0.0.0" \
- # Explicitly set PORT to match the exposed port
- PORT=4000 \
- # Use production settings for Yarn, Node and related nodejs based tools
- NODE_ENV="production" \
- # Add Ruby and Mastodon installation to the PATH
- DEBIAN_FRONTEND="noninteractive"
- # Set default shell used for running commands
- SHELL ["/bin/bash", "-o", "pipefail", "-o", "errexit", "-c"]
- ARG TARGETPLATFORM
- RUN echo "Target platform is ${TARGETPLATFORM}"
- RUN \
- # Remove automatic apt cache Docker cleanup scripts
- rm -f /etc/apt/apt.conf.d/docker-clean; \
- # Sets timezone
- echo "${TZ}" > /etc/localtime; \
- # Creates mastodon user/group and sets home directory
- groupadd -g "${GID}" mastodon; \
- useradd -l -u "${UID}" -g "${GID}" -m -d /opt/mastodon mastodon; \
- # Creates symlink for /mastodon folder
- ln -s /opt/mastodon /mastodon;
- # hadolint ignore=DL3008,DL3005
- RUN \
- # Mount Apt cache and lib directories from Docker buildx caches
- --mount=type=cache,id=apt-cache-${TARGETPLATFORM},target=/var/cache/apt,sharing=locked \
- --mount=type=cache,id=apt-lib-${TARGETPLATFORM},target=/var/lib/apt,sharing=locked \
- # Upgrade to check for security updates to Debian image
- apt-get update; \
- apt-get dist-upgrade -yq; \
- apt-get install -y --no-install-recommends \
- ca-certificates \
- curl \
- tzdata \
- wget \
- ;
- # Set /opt/mastodon as working directory
- WORKDIR /opt/mastodon
- # Copy Node package configuration files from build system to container
- COPY package.json yarn.lock .yarnrc.yml /opt/mastodon/
- COPY .yarn /opt/mastodon/.yarn
- # Copy Streaming source code from build system to container
- COPY ./streaming /opt/mastodon/streaming
- RUN \
- # Mount local Corepack and Yarn caches from Docker buildx caches
- --mount=type=cache,id=corepack-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/corepack,sharing=locked \
- --mount=type=cache,id=yarn-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/yarn,sharing=locked \
- # Configure Corepack
- rm /usr/local/bin/yarn*; \
- corepack enable; \
- corepack prepare --activate;
- RUN \
- # Mount Corepack and Yarn caches from Docker buildx caches
- --mount=type=cache,id=corepack-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/corepack,sharing=locked \
- --mount=type=cache,id=yarn-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/yarn,sharing=locked \
- # Install Node packages
- yarn workspaces focus --production @mastodon/streaming;
- # Set the running user for resulting container
- USER mastodon
- # Expose default Streaming ports
- EXPOSE 4000
- # Run streaming when started
- CMD [ node ./streaming/index.js ]
|