From c436a17459169c26820fbc0a98a946edcb3051b9 Mon Sep 17 00:00:00 2001 From: Kouhai Date: Wed, 5 Jul 2023 23:56:06 -0700 Subject: [PATCH] th: quieter yarn please yarn cache logs make woodpecker webui lag. this is not ideal. --- .yarnrc.yml | 4 ++ Dockerfile | 106 ++++++++++++++++++++++++++++++++++------------------ 2 files changed, 74 insertions(+), 36 deletions(-) diff --git a/.yarnrc.yml b/.yarnrc.yml index 7423a10c31..803a072eb3 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -3,3 +3,7 @@ enableGlobalCache: true nodeLinker: node-modules yarnPath: .yarn/releases/yarn-3.4.1.cjs + +logFilters: + - code: YN0013 + level: ${YARN_NOISE_LOG_CODE_LEVEL:-info} diff --git a/Dockerfile b/Dockerfile index 8a9fd15f04..c5412fe14e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,76 +4,100 @@ ARG NODE_IMAGE=node:18.16-bullseye-slim ARG RUBY_IMAGE=ghcr.io/moritzheiber/ruby-jemalloc:3.2.2-slim FROM ${RUBY_IMAGE} as ruby + +# build-base FROM ${NODE_IMAGE} as build-base COPY --link --from=ruby /opt/ruby /opt/ruby ENV DEBIAN_FRONTEND="noninteractive" \ - PATH="${PATH}:/opt/ruby/bin" \ - NODE_OPTIONS=--openssl-legacy-provider + PATH="${PATH}:/opt/ruby/bin" SHELL ["/bin/bash", "-o", "pipefail", "-c"] WORKDIR /opt/mastodon # hadolint ignore=DL3008 -RUN apt-get update && \ - apt-get install -y --no-install-recommends build-essential \ +RUN --mount=type=cache,id=apt,target=/var/cache/apt,sharing=private \ + set -eux && \ + rm -f /etc/apt/apt.conf.d/docker-clean && \ + echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache && \ + apt-get update && \ + apt-get install -y --no-install-recommends \ + build-essential \ ca-certificates \ git \ + libgdbm-dev \ + libgmp-dev \ libicu-dev \ libidn11-dev \ - libpq-dev \ libjemalloc-dev \ - zlib1g-dev \ - libgdbm-dev \ - libgmp-dev \ + libpq-dev \ + libreadline8 \ libssl-dev \ libyaml-0-2 \ - ca-certificates \ - libreadline8 \ python3 \ - shared-mime-info + shared-mime-info \ + zlib1g-dev COPY --link .yarn/releases/ /opt/mastodon/.yarn/releases/ COPY --link Gemfile* package.json yarn.lock .yarnrc.yml /opt/mastodon/ -RUN \ +ENV NODE_OPTIONS=--openssl-legacy-provider \ + YARN_GLOBAL_FOLDER=/opt/yarn \ + YARN_ENABLE_GLOBAL_CACHE=1 + +RUN --mount=type=cache,id=bundle,target=/opt/bundle/cache,sharing=private \ + --mount=type=cache,id=yarn,target=/opt/yarn/cache,sharing=private \ + set -eux && \ + bundle config set cache_path /opt/bundle/cache && \ + bundle config set silence_root_warning 'true' && \ + bundle cache --no-install && \ bundle config set --local deployment 'true' && \ - bundle config set --local without 'development test' && \ - bundle config set silence_root_warning true && \ - bundle install -j"$(nproc)" && \ - yarn install && \ - yarn cache clean + bundle install --local -j"$(nproc)" && \ + yarn install --immutable # Precompile assets # TODO(kouhai): we're currently patching node_modules because of emoji-mart. # we should integrate our own fork instead. COPY --link . /opt/mastodon +# build FROM build-base AS build ENV RAILS_ENV="production" \ NODE_ENV="production" +ENV NODE_OPTIONS=--openssl-legacy-provider \ + YARN_GLOBAL_FOLDER=/opt/yarn \ + YARN_ENABLE_GLOBAL_CACHE=1 + ENV OTP_SECRET=precompile_placeholder \ SECRET_KEY_BASE=precompile_placeholder \ RAKE_NO_YARN_INSTALL_HACK=1 -RUN mv ./emoji_data/all.json ./node_modules/emoji-mart/data/all.json && yarn install && \ - bundle exec rails assets:precompile +ENV BOOTSNAP_CACHE_DIR=/opt/mastodon/bootsnap + +RUN --mount=type=cache,id=yarn,target=/opt/yarn/cache,sharing=private \ + --mount=type=cache,id=webpacker,target=/opt/webpacker/cache,sharing=private \ + set -eux && \ + mkdir -p tmp/cache && \ + ln -sf /opt/webpacker/cache tmp/cache/webpacker && \ + mv ./emoji_data/all.json ./node_modules/emoji-mart/data/all.json && \ + yarn install && \ + bundle exec rails assets:precompile -FROM ${NODE_IMAGE} +# final image +FROM ${NODE_IMAGE} as output # Use those args to specify your own version flags & suffixes +ARG SOURCE_TAG="" ARG MASTODON_VERSION_FLAGS="" ARG MASTODON_VERSION_SUFFIX="" ARG UID="991" ARG GID="991" -COPY --link --from=ruby /opt/ruby /opt/ruby - SHELL ["/bin/bash", "-o", "pipefail", "-c"] ENV DEBIAN_FRONTEND="noninteractive" \ @@ -81,34 +105,39 @@ ENV DEBIAN_FRONTEND="noninteractive" \ # Ignoring these here since we don't want to pin any versions and the Debian image removes apt-get content after use # hadolint ignore=DL3008,DL3009 -RUN apt-get update && \ +RUN --mount=type=cache,id=apt,target=/var/cache/apt,sharing=private \ + set -eux && \ + rm -f /etc/apt/apt.conf.d/docker-clean && \ + echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache && \ + apt-get update && \ echo "Etc/UTC" > /etc/localtime && \ groupadd -g "${GID}" mastodon && \ useradd -l -u "$UID" -g "${GID}" -m -d /opt/mastodon mastodon && \ - apt-get -y --no-install-recommends install whois \ - wget \ - procps \ - libssl1.1 \ - libpq5 \ - imagemagick \ + apt-get -y --no-install-recommends install \ + ca-certificates \ ffmpeg \ - libjemalloc2 \ + file \ + imagemagick \ libicu67 \ libidn11 \ + libjemalloc2 \ + libpq5 \ + libreadline8 \ + libssl1.1 \ libyaml-0-2 \ - file \ - ca-certificates \ + procps \ + tini \ tzdata \ - libreadline8 \ - tini && \ - ln -s /opt/mastodon /mastodon + wget \ + whois \ + && ln -s /opt/mastodon /mastodon # Note: no, cleaning here since Debian does this automatically # See the file /etc/apt/apt.conf.d/docker-clean within the Docker image's filesystem +COPY --link --from=ruby /opt/ruby /opt/ruby COPY --link --chown=mastodon:mastodon --from=build /opt/mastodon /opt/mastodon -ARG SOURCE_TAG='' ENV RAILS_ENV="production" \ NODE_ENV="production" \ RAILS_SERVE_STATIC_FILES="true" \ @@ -117,6 +146,11 @@ ENV RAILS_ENV="production" \ MASTODON_VERSION_FLAGS="${MASTODON_VERSION_FLAGS}" \ MASTODON_VERSION_SUFFIX="${MASTODON_VERSION_SUFFIX}" +ENV BOOTSNAP_CACHE_DIR=/opt/mastodon/bootsnap + +# override this at will +ENV BOOTSNAP_READONLY=1 + # Set the run user USER mastodon WORKDIR /opt/mastodon