¿Cómo puedo minimizar el tamaño de la imagen Docker de Discourse?

Hola a todos,

Tuvimos que crear una imagen de Discourse para implementarla en nuestro clúster de K8s, que tiene algunas restricciones como no tener acceso a Internet, etc. El foro está destinado a ser interno, así que no hay problema con eso. Para lograr esto, seguí el método de instalación oficial compatible y creé un Dockerfile basado en los comandos de arranque y ejecución del script del lanzador, donde realizamos todos los pasos que no requieren una base de datos en tiempo de compilación y todos los pasos restantes al arrancar. Arranca un poco lento, pero es manejable por ahora.

Un problema con esto es que la imagen final es bastante grande ( ~2 GB ), ya que utilizo la imagen base de Discourse tal cual para ejecutar el script del lanzador encima. Revisé el Dockerfile de la imagen base aquí: discourse_docker/image/base/Dockerfile at master · discourse/discourse_docker · GitHub . Parece que se están instalando muchas cosas como postgres y redis. Estamos intentando usar un enfoque de múltiples contenedores, donde Discourse, Redis y Postgres están en contenedores diferentes. Entiendo que esta es una imagen base común para todos los sabores de instalaciones que admite la instalación compatible. Pero estoy buscando una manera de reducir el tamaño de la imagen final. Además de esto, eliminar cosas innecesarias sería mejor en términos de vulnerabilidades.

Mi pregunta es, ¿puedo eliminar de forma segura las dependencias de postgres y redis que se están instalando en la imagen de Docker base, sin romper nada en la aplicación de Discourse? ¿También es posible eliminar cosas como curl, wget de la imagen final, ya que rara vez se necesitarán en nuestra configuración, dado que la consola apenas será accesible de todos modos?

1 me gusta

Puedes. También tengo una iniciativa abierta para reducir la imagen haciendo exactamente eso aquí:

RE: imágenes lentas para arrancar – actualmente estamos trabajando en algo para eso también.

3 Me gusta

¿Es este un buen lugar para preguntar qué son las compilaciones “slim” y si los autoalojadores pueden hacer uso de ellas?

Donde una compilación normal es actualmente de aproximadamente 1G, las compilaciones slim son de aproximadamente 600M. (Mirando este índice de imágenes de docker)

(ask.discourse.com considera que estas compilaciones slim son útiles solo para este tipo de propósitos, pero no sé si la información es buena).

3 Me gusta

Intenté reemplazar la imagen base normal con la imagen base slim y comenzó a fallar. Veo muchos tipos diferentes de errores, por lo que no estoy seguro de qué los está causando.

Conjunto de errores 1

/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/definition.rb:683:in `materialize’: Could not find bootsnap-1.18.6, actionmailer-8.0.2, actionpack-8.0.2, actionview-8.0.2, activemodel-8.0.2, activerecord-8.0.2, activesupport-8.0.2, railties-8.0.2, propshaft-1.2.1, json-2.13.0, actionview_precompiler-0.4.0, discourse-seed-fu-2.3.12, mail-2.8.1, mini_mime-1.1.5, mini_suffix-0.3.3, redis-5.4.0, redis-namespace-1.11.0, active_model_serializers-0.8.4, http_accept_language-2.1.1, discourse-fonts-0.0.19, discourse-emojis-1.0.41, message_bus-4.4.1, rails_multisite-7.0.0, fastimage-2.3.1, aws-sdk-s3-1.182.0, aws-sdk-sns-1.96.0, excon-1.2.5, unf-0.2.0, email_reply_trimmer-0.2.0, image_optim-0.31.4, multi_json-1.17.0, mustache-1.1.1, nokogiri-1.18.8-x86_64-linux-gnu, loofah-2.24.1, css_parser-1.21.1, omniauth-2.1.2, omniauth-facebook-9.0.0, omniauth-twitter-1.4.0, omniauth-github-2.0.0, omniauth-oauth2-1.7.3, omniauth-google-oauth2-1.0.1, oj-3.16.11, pg-1.5.9, mini_sql-1.6.0, pry-rails-0.3.11, pry-byebug-3.11.0, rtlcss-0.2.1, messageformat-wrapper-1.1.0, rake-13.3.0, thor-1.4.0, diffy-3.4.4, rinku-2.0.6, sidekiq-7.3.9, mini_scheduler-0.18.0, execjs-2.10.0, mini_racer-0.19.0, highline-3.1.2, rack-2.2.17, rack-protection-3.2.0, cbor-0.5.9.8, cose-1.3.1, addressable-2.8.7, json_schemer-2.4.0, net-imap-0.5.9, digest-3.2.0, capybara-3.40.0, webmock-3.25.1, simplecov-0.22.0, test-prof-1.4.4, rails-dom-testing-2.3.0, minio_runner-1.0.0, capybara-playwright-driver-0.5.6, rspec-3.13.1, listen-3.9.0, certified-1.0.0, fabrication-3.0.0, mocha-2.7.1, rb-fsevent-0.11.2, rspec-rails-8.0.1, shoulda-matchers-6.5.0, rspec-html-matchers-0.10.0, pry-stack_explorer-0.6.1, byebug-12.0.0, rubocop-discourse-3.12.1, parallel_tests-5.3.0, rswag-specs-2.16.0, annotaterb-4.17.0, syntax_tree-6.3.0, rspec-multi-mock-0.3.1, ruby-prof-1.7.2, bullet-8.0.8, better_errors-2.10.1, binding_of_caller-1.0.1, yaml-lint-0.1.2, yard-0.9.37, discourse_dev_assets-0.0.5, faker-3.5.2, fast_blank-1.0.1, lru_redux-1.1.0, htmlentities-4.3.4, rack-mini-profiler-4.0.0, unicorn-6.1.0, puma-6.6.0, rbtrace-0.5.2, ruby-readability-0.7.2, stackprof-0.2.27, memory_profiler-1.1.0, cppjieba_rb-0.4.4, lograge-0.14.0, logstash-event-1.2.02, logster-2.20.1, sassc-embedded-1.80.2, rotp-6.3.0, rqrcode-3.1.0, rubyzip-2.4.1, sshkey-3.0.0, rchardet-1.9.0, lz4-ruby-0.3.3, sanitize-7.0.0, web-push-3.0.1, colored2-4.0.3, maxminddb-0.1.22, rails_failover-2.3.0, faraday-2.13.3, faraday-retry-2.3.2, net-http-0.6.0, cgi-0.5.0, tzinfo-data-1.2025.2, csv-3.3.5, iso8601-0.13.0, rrule-0.6.0, dry-initializer-3.2.0, parallel-1.27.0, inflection-1.0.0, multipart-post-2.4.1, faraday-multipart-1.1.1, zendesk_api-1.38.0.rc1, stripe-11.1.0, sawyer-0.9.2, octokit-5.6.1, tokenizers-0.5.5-x86_64-linux, tokenizers-0.5.5, tiktoken_ruby-0.0.11.1-x86_64-linux, discourse_ai-tokenizers-0.3.1, ed25519-1.4.0, Ascii85-2.0.1, ruby-rc4-0.1.5, hashery-2.1.2, ttfunk-1.8.0, afm-0.2.2, pdf-reader-2.14.1, msgpack-1.8.0, activejob-8.0.2, rack-session-1.0.2, rack-test-2.2.0, rails-html-sanitizer-1.6.2, useragent-0.16.11, builder-3.3.0, erubi-1.13.1, timeout-0.4.3, base64-0.3.0, benchmark-0.4.1, bigdecimal-3.2.2, concurrent-ruby-1.3.5, connection_pool-2.5.3, drb-2.2.3, i18n-1.14.7, logger-1.7.0, minitest-5.25.5, securerandom-0.4.1, tzinfo-2.0.6, uri-1.0.3, irb-1.15.2, rackup-1.0.1, zeitwerk-2.7.3, ffi-1.17.2-x86_64-linux-gnu, redis-client-0.25.1, aws-sdk-core-3.226.0, aws-sdk-kms-1.99.0, aws-sigv4-1.12.1, exifr-1.4.1, fspath-3.1.2, image_size-3.4.0, in_threads-1.6.0, progress-3.6.0, racc-1.8.1, crass-1.0.6, hashie-5.0.0, omniauth-oauth-1.2.1, oauth2-1.4.11, jwt-2.10.1, ostruct-0.6.3, pry-0.15.2, libv8-node-24.1.0.0-x86_64-linux, libv8-node-24.1.0.0, reline-0.6.2, openssl-signature_algorithm-1.3.0, public_suffix-6.0.2, hana-1.3.7, regexp_parser-2.10.0, simpleidn-0.2.3, date-3.4.1, matrix-0.4.3, xpath-3.2.0, crack-1.0.0, hashdiff-1.2.0, docile-1.4.1, simplecov-html-0.13.2, simplecov_json_formatter-0.1.4, playwright-ruby-client-1.52.0, rspec-core-3.13.5, rspec-expectations-3.13.5, rspec-mocks-3.13.5, rb-inotify-0.11.1, rspec-support-3.13.4, lint_roller-1.1.0, rubocop-1.78.0, rubocop-capybara-2.22.1, rubocop-factory_bot-2.27.1, rubocop-rails-2.32.0, rubocop-rspec-3.6.0, rubocop-rspec_rails-2.31.0, json-schema-5.2.1, prettier_print-1.2.1, uniform_notifier-1.17.0, rouge-4.6.0, debug_inspector-1.2.0, literate_randomizer-0.4.0, kgio-2.11.4, raindrops-0.20.1, nio4r-2.7.4, optimist-3.2.1, guess_html_encoding-0.0.11, rexml-3.4.1, request_store-1.7.0, sass-embedded-1.85.0-x86_64-linux-gnu, chunky_png-1.4.0, rqrcode_core-2.0.0, openssl-3.3.0, faraday-net_http-3.4.1, globalid-1.2.1, pp-0.6.2, rdoc-6.14.2, webrick-1.9.1, aws-eventstream-1.4.0, aws-partitions-1.1117.0, jmespath-1.6.2, oauth-1.1.0, multi_xml-0.7.2, coderay-1.1.3, method_source-1.1.0, io-console-0.8.1, mime-types-3.7.0, diff-lcs-1.6.2, language_server-protocol-3.17.0.5, parser-3.3.8.0, rainbow-3.1.1, rubocop-ast-1.46.0, ruby-progressbar-1.13.0, unicode-display_width-3.1.4, google-protobuf-4.31.1-x86_64-linux-gnu, google-protobuf-4.31.1, erb-5.0.2, psych-5.2.6, oauth-tty-1.0.5, snaky_hash-2.0.3, version_gem-1.1.8, mime-types-data-3.2025.0715, ast-2.4.3, prism-1.4.0, unicode-emoji-4.0.4, stringio-3.1.7 in locally installed gems (Bundler::GemNotFound)

y

supervisor pid: 577 unicorn pid: 583
./config/unicorn_launcher: line 66: unicorn: command not found

EDIT: Lamento las molestias. Estos fallos podrían deberse simplemente a los fallos en el tiempo de compilación. Por alguna razón, la compilación parecía completarse normalmente. Pero ahora que lo veo, puedo ver que algunos pasos fallaron. Especialmente cd /var/www/discourse && su discourse -c 'bundle install --jobs $(($(nproc) - 1)) --retry 3', debido a un problema de permisos. Aunque me pregunto, ¿por qué cambió esto entre la imagen base slim y la normal?

Error durante el paso de compilación

Reintentando descargar gem de https://rubygems.org/`` debido a error (2/4): Bundler::PermissionError Hubo un error al intentar escribir en /usr/local/lib/ruby/gems/3.3.0/cache/rake-13.3.0.gem. Es probable que necesites otorgar permisos de escritura para esa ruta.

La imagen slim todavía incluye postgres y redis.

La diferencia entre slim y las otras comienza en el comando 37. Los siguientes comandos no se ejecutan en la slim:

ENV RAILS_ENV=production
RUN |3 DEBIAN_RELEASE=bookworm PG_MAJOR=15 DISCOURSE_BRANCH=main /bin/sh -c cd /var/www/discourse &&    sudo -u discourse bundle config --local deployment true &&    sudo -u discourse bundle config --local path ./vendor/bundle &&    sudo -u discourse bundle config --local without test development &&    sudo -u discourse bundle install --jobs $(($(nproc) - 1)) &&    find /var/www/discourse/vendor/bundle -name cache -not -path '*/gems/*' -type d -exec rm -rf {} + &&    find /var/www/discourse/vendor/bundle -name tmp -type d -exec rm -rf {} + # buildkit
RUN |3 DEBIAN_RELEASE=bookworm PG_MAJOR=15 DISCOURSE_BRANCH=main /bin/sh -c cd /var/www/discourse &&    sudo -u discourse /bin/bash -c 'if [ -f yarn.lock ]; then yarn install --frozen-lockfile && yarn cache clean; else pnpm install --frozen-lockfile; fi' # buildkit

Básicamente, faltan algunos pasos de compilación. No hay bundle install ni pnpm install. Cosas que eventualmente necesitarás.

Los grandes problemas están en el comando 11: 390MiB

RUN |2 DEBIAN_RELEASE=bookworm PG_MAJOR=15 /bin/sh -c echo "debconf debconf/frontend select Teletype" | debconf-set-selections;     apt-get -y update && DEBIAN_FRONTEND=noninteractive apt-get -y install gnupg sudo curl fping locales     ca-certificates rsync     cmake g++ pkg-config patch     libxslt-dev libcurl4-openssl-dev     libssl-dev libyaml-dev libtool     libpcre3 libpcre3-dev zlib1g zlib1g-dev     libxml2-dev gawk parallel     libreadline-dev anacron wget     psmisc whois brotli libunwind-dev     libtcmalloc-minimal4 cmake     pngcrush pngquant ripgrep poppler-utils     ghostscript libjbig0 libtiff6 libpng16-16 libfontconfig1     libwebpdemux2 libwebpmux3 libxext6 librsvg2-2 libgomp1     fonts-urw-base35 libheif1/${DEBIAN_RELEASE}-backports     nginx-common &&     DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends git rsyslog logrotate cron ssh-client less;     install -d /usr/share/postgresql-common/pgdg &&    curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc &&    echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt ${DEBIAN_RELEASE}-pgdg main" > /etc/apt/sources.list.d/pgdg.list;     curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -;     echo "deb https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list;     curl --silent --location https://deb.nodesource.com/setup_22.x | sudo bash -;     sed -i -e 's/start -q anacron/anacron -s/' /etc/cron.d/anacron;     sed -i.bak 's/$ModLoad imklog/#$ModLoad imklog/' /etc/rsyslog.conf;     sed -i.bak 's/module(load="imklog")/#module(load="imklog")/' /etc/rsyslog.conf;     dpkg-divert --local --rename --add /sbin/initctl;     sh -c "test -f /sbin/initctl || ln -s /bin/true /sbin/initctl";     apt-get -y update && DEBIAN_FRONTEND=noninteractive apt-get -y install runit socat     libpq-dev postgresql-client-${PG_MAJOR}     postgresql-${PG_MAJOR} postgresql-contrib-${PG_MAJOR} postgresql-${PG_MAJOR}-pgvector     nodejs yarn &&    mkdir -p /etc/runit/1.d # buildkit

Instala muchas herramientas necesarias para otras partes, también postgresql:

> gnupg sudo curl fping locales ca-certificates rsync cmake g++ pkg-config patch libxslt-dev libcurl4-openssl-dev libssl-dev libyaml-dev libtool libpcre3 libpcre3-dev zlib1g zlib1g-dev libxml2-dev gawk parallel libreadline-dev anacron wget psmisc whois brotli libunwind-dev libtcmalloc-minimal4 cmake pngcrush pngquant ripgrep poppler-utils ghostscript libjbig0 libtiff6 libpng16-16 libfontconfig1 libwebpdemux2 libwebpmux3 libxext6 librsvg2-2 libgomp1 fonts-urw-base35 libheif1 nginx-common git rsyslog logrotate cron ssh-client less runit socat libpq-dev postgresql-client postgresql postgresql-contrib postgresql-pgvector nodejs yarn

1 me gusta

Aparte de postgres+redis (para lo cual tengo una propuesta para proporcionar arriba), algunas de las bibliotecas más grandes instaladas allí son para compilar gemas que Discourse utiliza. Actualmente no hay una forma buena y sencilla de eliminar esas bibliotecas en este momento.

Seguimiento, la propuesta anterior se ha fusionado y ahora se están creando imágenes *-web-only, para imágenes que no incluyen postgres o redis. (la última etiqueta creada en el momento de escribir esto es discourse/base:2.0.20250813-2244-web-only)

2 Me gusta

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.