When generating scripts from templates, don't add a leading newline so that their shebangs may be handled correctly. ### Pull Request Checklist <!-- Please read https://element-hq.github.io/synapse/latest/development/contributing_guide.html before submitting your pull request --> * [x] Pull request is based on the develop branch * [x] Pull request includes a [changelog file](https://element-hq.github.io/synapse/latest/development/contributing_guide.html#changelog). The entry should: - Be a short description of your change which makes sense to users. "Fixed a bug that prevented receiving messages from other servers." instead of "Moved X method from `EventStore` to `EventWorkerStore`.". - Use markdown where necessary, mostly for `code blocks`. - End with either a period (.) or an exclamation mark (!). - Start with a capital letter. - Feel free to credit yourself, by adding a sentence "Contributed by @github_username." or "Contributed by [Your Name]." to the end of the entry. * [x] [Code style](https://element-hq.github.io/synapse/latest/code_style.html) is correct (run the [linters](https://element-hq.github.io/synapse/latest/development/contributing_guide.html#run-the-linters)) --------- Co-authored-by: Quentin Gliech <quenting@element.io>
78 lines
3.2 KiB
Plaintext
78 lines
3.2 KiB
Plaintext
# syntax=docker/dockerfile:1
|
|
|
|
ARG SYNAPSE_VERSION=latest
|
|
ARG FROM=matrixdotorg/synapse:$SYNAPSE_VERSION
|
|
ARG DEBIAN_VERSION=bookworm
|
|
ARG PYTHON_VERSION=3.12
|
|
|
|
# first of all, we create a base image with dependencies which we can copy into the
|
|
# target image. For repeated rebuilds, this is much faster than apt installing
|
|
# each time.
|
|
|
|
FROM ghcr.io/astral-sh/uv:python${PYTHON_VERSION}-${DEBIAN_VERSION} AS deps_base
|
|
|
|
# Tell apt to keep downloaded package files, as we're using cache mounts.
|
|
RUN rm -f /etc/apt/apt.conf.d/docker-clean; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache
|
|
|
|
RUN \
|
|
--mount=type=cache,target=/var/cache/apt,sharing=locked \
|
|
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
|
apt-get update -qq && \
|
|
DEBIAN_FRONTEND=noninteractive apt-get install -yqq --no-install-recommends \
|
|
nginx-light
|
|
|
|
RUN \
|
|
# remove default page
|
|
rm /etc/nginx/sites-enabled/default && \
|
|
# have nginx log to stderr/out
|
|
ln -sf /dev/stdout /var/log/nginx/access.log && \
|
|
ln -sf /dev/stderr /var/log/nginx/error.log
|
|
|
|
# --link-mode=copy silences a warning as uv isn't able to do hardlinks between its cache
|
|
# (mounted as --mount=type=cache) and the target directory.
|
|
RUN --mount=type=cache,target=/root/.cache/uv \
|
|
uv pip install --link-mode=copy --prefix="/uv/usr/local" supervisor~=4.2
|
|
|
|
RUN mkdir -p /uv/etc/supervisor/conf.d
|
|
|
|
# Similarly, a base to copy the redis server from.
|
|
#
|
|
# The redis docker image has fewer dynamic libraries than the debian package,
|
|
# which makes it much easier to copy (but we need to make sure we use an image
|
|
# based on the same debian version as the synapse image, to make sure we get
|
|
# the expected version of libc.
|
|
FROM docker.io/library/redis:7-${DEBIAN_VERSION} AS redis_base
|
|
|
|
# now build the final image, based on the the regular Synapse docker image
|
|
FROM $FROM
|
|
|
|
# Copy over dependencies
|
|
COPY --from=redis_base /usr/local/bin/redis-server /usr/local/bin
|
|
COPY --from=deps_base /uv /
|
|
COPY --from=deps_base /usr/sbin/nginx /usr/sbin
|
|
COPY --from=deps_base /usr/share/nginx /usr/share/nginx
|
|
COPY --from=deps_base /usr/lib/nginx /usr/lib/nginx
|
|
COPY --from=deps_base /etc/nginx /etc/nginx
|
|
COPY --from=deps_base /var/log/nginx /var/log/nginx
|
|
# chown to allow non-root user to write to http-*-temp-path dirs
|
|
COPY --from=deps_base --chown=www-data:root /var/lib/nginx /var/lib/nginx
|
|
|
|
# Copy Synapse worker, nginx and supervisord configuration template files
|
|
COPY ./docker/conf-workers/* /conf/
|
|
|
|
# Copy a script to prefix log lines with the supervisor program name
|
|
COPY ./docker/prefix-log /usr/local/bin/
|
|
|
|
# Expose nginx listener port
|
|
EXPOSE 8080/tcp
|
|
|
|
# A script to read environment variables and create the necessary
|
|
# files to run the desired worker configuration. Will start supervisord.
|
|
COPY ./docker/configure_workers_and_start.py /configure_workers_and_start.py
|
|
ENTRYPOINT ["/configure_workers_and_start.py"]
|
|
|
|
# Replace the healthcheck with one which checks *all* the workers. The script
|
|
# is generated by configure_workers_and_start.py.
|
|
HEALTHCHECK --start-period=5s --interval=15s --timeout=5s \
|
|
CMD ["/healthcheck.sh"]
|