From 4294a4d1a0acbb1ed192c2141ed45b98e9a4c41e Mon Sep 17 00:00:00 2001 From: Richard van der Hoff Date: Wed, 13 Apr 2022 15:47:17 +0100 Subject: [PATCH] Dockerfile-workers: reduce the amount we install This is an attempt to reduce the rebuild time. In short, we reduce the amount of stuff that the dockerfile installs, so as to give a faster startup. --- changelog.d/12464.misc | 1 + docker/Dockerfile-workers | 17 ++++++++++++++--- docker/configure_workers_and_start.py | 19 +++++++++---------- 3 files changed, 24 insertions(+), 13 deletions(-) create mode 100644 changelog.d/12464.misc diff --git a/changelog.d/12464.misc b/changelog.d/12464.misc new file mode 100644 index 000000000000..7a8cc6ba512c --- /dev/null +++ b/changelog.d/12464.misc @@ -0,0 +1 @@ +Dockerfile-workers: reduce the amount we install in the image. diff --git a/docker/Dockerfile-workers b/docker/Dockerfile-workers index 6fb1cdbfb020..9ccb2b22a750 100644 --- a/docker/Dockerfile-workers +++ b/docker/Dockerfile-workers @@ -2,10 +2,19 @@ FROM matrixdotorg/synapse # Install deps -RUN apt-get update -RUN apt-get install -y supervisor redis nginx +RUN \ + --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + redis-server nginx-light -# Remove the default nginx sites +# Install supervisord with pip instead of apt, to avoid installing a second +# copy of python. +RUN --mount=type=cache,target=/root/.cache/pip \ + pip install supervisor~=4.2 + +# Disable the default nginx sites RUN rm /etc/nginx/sites-enabled/default # Copy Synapse worker, nginx and supervisord configuration template files @@ -19,5 +28,7 @@ EXPOSE 8080/tcp 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 /bin/sh /healthcheck.sh diff --git a/docker/configure_workers_and_start.py b/docker/configure_workers_and_start.py index 3e91024e8c92..7bcb07b52c2e 100755 --- a/docker/configure_workers_and_start.py +++ b/docker/configure_workers_and_start.py @@ -512,9 +512,10 @@ def generate_worker_files(environ, config_path: str, data_dir: str): ) # Supervisord config + os.makedirs("/etc/supervisor", exist_ok=True) convert( "/conf/supervisord.conf.j2", - "/etc/supervisor/conf.d/supervisord.conf", + "/etc/supervisor/supervisord.conf", main_config_path=config_path, worker_config=supervisord_config, ) @@ -532,14 +533,6 @@ def generate_worker_files(environ, config_path: str, data_dir: str): os.mkdir(log_dir) -def start_supervisord(): - """Starts up supervisord which then starts and monitors all other necessary processes - - Raises: CalledProcessError if calling start.py return a non-zero exit code. - """ - subprocess.run(["/usr/bin/supervisord"], stdin=subprocess.PIPE) - - def main(args, environ): config_dir = environ.get("SYNAPSE_CONFIG_DIR", "/data") config_path = environ.get("SYNAPSE_CONFIG_PATH", config_dir + "/homeserver.yaml") @@ -567,7 +560,13 @@ def main(args, environ): # Start supervisord, which will start Synapse, all of the configured worker # processes, redis, nginx etc. according to the config we created above. - start_supervisord() + log("Starting supervisord") + os.execl( + "/usr/local/bin/supervisord", + "supervisord", + "-c", + "/etc/supervisor/supervisord.conf", + ) if __name__ == "__main__":