From c0d8b82aa518cb25a92e8d4b2b5f71ea9e69054d Mon Sep 17 00:00:00 2001 From: Jarek Prokop Date: Mon, 12 Jan 2026 12:08:38 +0100 Subject: [PATCH 1/7] Move 3.3 to 4.0. --- {3.3 => 4.0}/.exclude-c9s | 0 {3.3 => 4.0}/Dockerfile.c10s | 0 {3.3 => 4.0}/Dockerfile.c9s | 0 {3.3 => 4.0}/Dockerfile.fedora | 0 {3.3 => 4.0}/Dockerfile.rhel10 | 0 {3.3 => 4.0}/Dockerfile.rhel8 | 0 {3.3 => 4.0}/Dockerfile.rhel9 | 0 {3.3 => 4.0}/README.md | 0 {3.3 => 4.0}/root/opt/app-root/.gemrc | 0 {3.3 => 4.0}/root/opt/app-root/etc/puma.cfg | 0 {3.3 => 4.0}/s2i/bin/assemble | 0 {3.3 => 4.0}/s2i/bin/run | 0 {3.3 => 4.0}/s2i/bin/usage | 0 {3.3 => 4.0}/test/__init__.py | 0 {3.3 => 4.0}/test/conftest.py | 0 {3.3 => 4.0}/test/examples | 0 {3.3 => 4.0}/test/imagestreams | 0 {3.3 => 4.0}/test/puma-test-app/Gemfile | 0 {3.3 => 4.0}/test/puma-test-app/Gemfile.lock | 0 {3.3 => 4.0}/test/puma-test-app/app.rb | 0 {3.3 => 4.0}/test/puma-test-app/config.ru | 0 {3.3 => 4.0}/test/rack-test-app/Gemfile | 0 {3.3 => 4.0}/test/rack-test-app/Gemfile.lock | 0 {3.3 => 4.0}/test/rack-test-app/app.rb | 0 {3.3 => 4.0}/test/rack-test-app/config.ru | 0 {3.3 => 4.0}/test/run | 0 {3.3 => 4.0}/test/run-openshift-pytest | 0 {3.3 => 4.0}/test/run-pytest | 0 {3.3 => 4.0}/test/test-fips/Gemfile | 0 {3.3 => 4.0}/test/test-fips/app.rb | 0 {3.3 => 4.0}/test/test-fips/config.ru | 0 {3.3 => 4.0}/test/test-lib-openshift.sh | 0 {3.3 => 4.0}/test/test-lib-remote-openshift.sh | 0 {3.3 => 4.0}/test/test-lib.sh | 0 {3.3 => 4.0}/test/test-openshift.yaml | 0 {3.3 => 4.0}/test/test_container_application.py | 0 {3.3 => 4.0}/test/test_container_basics.py | 0 {3.3 => 4.0}/test/test_container_fips.py | 0 {3.3 => 4.0}/test/test_ocp_helm_ruby_imagestreams.py | 0 {3.3 => 4.0}/test/test_ocp_helm_ruby_rails_application.py | 0 {3.3 => 4.0}/test/test_ocp_ruby_ex_standalone.py | 0 {3.3 => 4.0}/test/test_ocp_ruby_latest_imagestreams.py | 0 {3.3 => 4.0}/test/test_ocp_s2i_imagestreams.py | 0 {3.3 => 4.0}/test/test_ocp_s2i_integration.py | 0 {3.3 => 4.0}/test/test_ocp_s2i_templates.py | 0 45 files changed, 0 insertions(+), 0 deletions(-) rename {3.3 => 4.0}/.exclude-c9s (100%) rename {3.3 => 4.0}/Dockerfile.c10s (100%) rename {3.3 => 4.0}/Dockerfile.c9s (100%) rename {3.3 => 4.0}/Dockerfile.fedora (100%) rename {3.3 => 4.0}/Dockerfile.rhel10 (100%) rename {3.3 => 4.0}/Dockerfile.rhel8 (100%) rename {3.3 => 4.0}/Dockerfile.rhel9 (100%) rename {3.3 => 4.0}/README.md (100%) rename {3.3 => 4.0}/root/opt/app-root/.gemrc (100%) rename {3.3 => 4.0}/root/opt/app-root/etc/puma.cfg (100%) rename {3.3 => 4.0}/s2i/bin/assemble (100%) rename {3.3 => 4.0}/s2i/bin/run (100%) rename {3.3 => 4.0}/s2i/bin/usage (100%) rename {3.3 => 4.0}/test/__init__.py (100%) rename {3.3 => 4.0}/test/conftest.py (100%) rename {3.3 => 4.0}/test/examples (100%) rename {3.3 => 4.0}/test/imagestreams (100%) rename {3.3 => 4.0}/test/puma-test-app/Gemfile (100%) rename {3.3 => 4.0}/test/puma-test-app/Gemfile.lock (100%) rename {3.3 => 4.0}/test/puma-test-app/app.rb (100%) rename {3.3 => 4.0}/test/puma-test-app/config.ru (100%) rename {3.3 => 4.0}/test/rack-test-app/Gemfile (100%) rename {3.3 => 4.0}/test/rack-test-app/Gemfile.lock (100%) rename {3.3 => 4.0}/test/rack-test-app/app.rb (100%) rename {3.3 => 4.0}/test/rack-test-app/config.ru (100%) rename {3.3 => 4.0}/test/run (100%) rename {3.3 => 4.0}/test/run-openshift-pytest (100%) rename {3.3 => 4.0}/test/run-pytest (100%) rename {3.3 => 4.0}/test/test-fips/Gemfile (100%) rename {3.3 => 4.0}/test/test-fips/app.rb (100%) rename {3.3 => 4.0}/test/test-fips/config.ru (100%) rename {3.3 => 4.0}/test/test-lib-openshift.sh (100%) rename {3.3 => 4.0}/test/test-lib-remote-openshift.sh (100%) rename {3.3 => 4.0}/test/test-lib.sh (100%) rename {3.3 => 4.0}/test/test-openshift.yaml (100%) rename {3.3 => 4.0}/test/test_container_application.py (100%) rename {3.3 => 4.0}/test/test_container_basics.py (100%) rename {3.3 => 4.0}/test/test_container_fips.py (100%) rename {3.3 => 4.0}/test/test_ocp_helm_ruby_imagestreams.py (100%) rename {3.3 => 4.0}/test/test_ocp_helm_ruby_rails_application.py (100%) rename {3.3 => 4.0}/test/test_ocp_ruby_ex_standalone.py (100%) rename {3.3 => 4.0}/test/test_ocp_ruby_latest_imagestreams.py (100%) rename {3.3 => 4.0}/test/test_ocp_s2i_imagestreams.py (100%) rename {3.3 => 4.0}/test/test_ocp_s2i_integration.py (100%) rename {3.3 => 4.0}/test/test_ocp_s2i_templates.py (100%) diff --git a/3.3/.exclude-c9s b/4.0/.exclude-c9s similarity index 100% rename from 3.3/.exclude-c9s rename to 4.0/.exclude-c9s diff --git a/3.3/Dockerfile.c10s b/4.0/Dockerfile.c10s similarity index 100% rename from 3.3/Dockerfile.c10s rename to 4.0/Dockerfile.c10s diff --git a/3.3/Dockerfile.c9s b/4.0/Dockerfile.c9s similarity index 100% rename from 3.3/Dockerfile.c9s rename to 4.0/Dockerfile.c9s diff --git a/3.3/Dockerfile.fedora b/4.0/Dockerfile.fedora similarity index 100% rename from 3.3/Dockerfile.fedora rename to 4.0/Dockerfile.fedora diff --git a/3.3/Dockerfile.rhel10 b/4.0/Dockerfile.rhel10 similarity index 100% rename from 3.3/Dockerfile.rhel10 rename to 4.0/Dockerfile.rhel10 diff --git a/3.3/Dockerfile.rhel8 b/4.0/Dockerfile.rhel8 similarity index 100% rename from 3.3/Dockerfile.rhel8 rename to 4.0/Dockerfile.rhel8 diff --git a/3.3/Dockerfile.rhel9 b/4.0/Dockerfile.rhel9 similarity index 100% rename from 3.3/Dockerfile.rhel9 rename to 4.0/Dockerfile.rhel9 diff --git a/3.3/README.md b/4.0/README.md similarity index 100% rename from 3.3/README.md rename to 4.0/README.md diff --git a/3.3/root/opt/app-root/.gemrc b/4.0/root/opt/app-root/.gemrc similarity index 100% rename from 3.3/root/opt/app-root/.gemrc rename to 4.0/root/opt/app-root/.gemrc diff --git a/3.3/root/opt/app-root/etc/puma.cfg b/4.0/root/opt/app-root/etc/puma.cfg similarity index 100% rename from 3.3/root/opt/app-root/etc/puma.cfg rename to 4.0/root/opt/app-root/etc/puma.cfg diff --git a/3.3/s2i/bin/assemble b/4.0/s2i/bin/assemble similarity index 100% rename from 3.3/s2i/bin/assemble rename to 4.0/s2i/bin/assemble diff --git a/3.3/s2i/bin/run b/4.0/s2i/bin/run similarity index 100% rename from 3.3/s2i/bin/run rename to 4.0/s2i/bin/run diff --git a/3.3/s2i/bin/usage b/4.0/s2i/bin/usage similarity index 100% rename from 3.3/s2i/bin/usage rename to 4.0/s2i/bin/usage diff --git a/3.3/test/__init__.py b/4.0/test/__init__.py similarity index 100% rename from 3.3/test/__init__.py rename to 4.0/test/__init__.py diff --git a/3.3/test/conftest.py b/4.0/test/conftest.py similarity index 100% rename from 3.3/test/conftest.py rename to 4.0/test/conftest.py diff --git a/3.3/test/examples b/4.0/test/examples similarity index 100% rename from 3.3/test/examples rename to 4.0/test/examples diff --git a/3.3/test/imagestreams b/4.0/test/imagestreams similarity index 100% rename from 3.3/test/imagestreams rename to 4.0/test/imagestreams diff --git a/3.3/test/puma-test-app/Gemfile b/4.0/test/puma-test-app/Gemfile similarity index 100% rename from 3.3/test/puma-test-app/Gemfile rename to 4.0/test/puma-test-app/Gemfile diff --git a/3.3/test/puma-test-app/Gemfile.lock b/4.0/test/puma-test-app/Gemfile.lock similarity index 100% rename from 3.3/test/puma-test-app/Gemfile.lock rename to 4.0/test/puma-test-app/Gemfile.lock diff --git a/3.3/test/puma-test-app/app.rb b/4.0/test/puma-test-app/app.rb similarity index 100% rename from 3.3/test/puma-test-app/app.rb rename to 4.0/test/puma-test-app/app.rb diff --git a/3.3/test/puma-test-app/config.ru b/4.0/test/puma-test-app/config.ru similarity index 100% rename from 3.3/test/puma-test-app/config.ru rename to 4.0/test/puma-test-app/config.ru diff --git a/3.3/test/rack-test-app/Gemfile b/4.0/test/rack-test-app/Gemfile similarity index 100% rename from 3.3/test/rack-test-app/Gemfile rename to 4.0/test/rack-test-app/Gemfile diff --git a/3.3/test/rack-test-app/Gemfile.lock b/4.0/test/rack-test-app/Gemfile.lock similarity index 100% rename from 3.3/test/rack-test-app/Gemfile.lock rename to 4.0/test/rack-test-app/Gemfile.lock diff --git a/3.3/test/rack-test-app/app.rb b/4.0/test/rack-test-app/app.rb similarity index 100% rename from 3.3/test/rack-test-app/app.rb rename to 4.0/test/rack-test-app/app.rb diff --git a/3.3/test/rack-test-app/config.ru b/4.0/test/rack-test-app/config.ru similarity index 100% rename from 3.3/test/rack-test-app/config.ru rename to 4.0/test/rack-test-app/config.ru diff --git a/3.3/test/run b/4.0/test/run similarity index 100% rename from 3.3/test/run rename to 4.0/test/run diff --git a/3.3/test/run-openshift-pytest b/4.0/test/run-openshift-pytest similarity index 100% rename from 3.3/test/run-openshift-pytest rename to 4.0/test/run-openshift-pytest diff --git a/3.3/test/run-pytest b/4.0/test/run-pytest similarity index 100% rename from 3.3/test/run-pytest rename to 4.0/test/run-pytest diff --git a/3.3/test/test-fips/Gemfile b/4.0/test/test-fips/Gemfile similarity index 100% rename from 3.3/test/test-fips/Gemfile rename to 4.0/test/test-fips/Gemfile diff --git a/3.3/test/test-fips/app.rb b/4.0/test/test-fips/app.rb similarity index 100% rename from 3.3/test/test-fips/app.rb rename to 4.0/test/test-fips/app.rb diff --git a/3.3/test/test-fips/config.ru b/4.0/test/test-fips/config.ru similarity index 100% rename from 3.3/test/test-fips/config.ru rename to 4.0/test/test-fips/config.ru diff --git a/3.3/test/test-lib-openshift.sh b/4.0/test/test-lib-openshift.sh similarity index 100% rename from 3.3/test/test-lib-openshift.sh rename to 4.0/test/test-lib-openshift.sh diff --git a/3.3/test/test-lib-remote-openshift.sh b/4.0/test/test-lib-remote-openshift.sh similarity index 100% rename from 3.3/test/test-lib-remote-openshift.sh rename to 4.0/test/test-lib-remote-openshift.sh diff --git a/3.3/test/test-lib.sh b/4.0/test/test-lib.sh similarity index 100% rename from 3.3/test/test-lib.sh rename to 4.0/test/test-lib.sh diff --git a/3.3/test/test-openshift.yaml b/4.0/test/test-openshift.yaml similarity index 100% rename from 3.3/test/test-openshift.yaml rename to 4.0/test/test-openshift.yaml diff --git a/3.3/test/test_container_application.py b/4.0/test/test_container_application.py similarity index 100% rename from 3.3/test/test_container_application.py rename to 4.0/test/test_container_application.py diff --git a/3.3/test/test_container_basics.py b/4.0/test/test_container_basics.py similarity index 100% rename from 3.3/test/test_container_basics.py rename to 4.0/test/test_container_basics.py diff --git a/3.3/test/test_container_fips.py b/4.0/test/test_container_fips.py similarity index 100% rename from 3.3/test/test_container_fips.py rename to 4.0/test/test_container_fips.py diff --git a/3.3/test/test_ocp_helm_ruby_imagestreams.py b/4.0/test/test_ocp_helm_ruby_imagestreams.py similarity index 100% rename from 3.3/test/test_ocp_helm_ruby_imagestreams.py rename to 4.0/test/test_ocp_helm_ruby_imagestreams.py diff --git a/3.3/test/test_ocp_helm_ruby_rails_application.py b/4.0/test/test_ocp_helm_ruby_rails_application.py similarity index 100% rename from 3.3/test/test_ocp_helm_ruby_rails_application.py rename to 4.0/test/test_ocp_helm_ruby_rails_application.py diff --git a/3.3/test/test_ocp_ruby_ex_standalone.py b/4.0/test/test_ocp_ruby_ex_standalone.py similarity index 100% rename from 3.3/test/test_ocp_ruby_ex_standalone.py rename to 4.0/test/test_ocp_ruby_ex_standalone.py diff --git a/3.3/test/test_ocp_ruby_latest_imagestreams.py b/4.0/test/test_ocp_ruby_latest_imagestreams.py similarity index 100% rename from 3.3/test/test_ocp_ruby_latest_imagestreams.py rename to 4.0/test/test_ocp_ruby_latest_imagestreams.py diff --git a/3.3/test/test_ocp_s2i_imagestreams.py b/4.0/test/test_ocp_s2i_imagestreams.py similarity index 100% rename from 3.3/test/test_ocp_s2i_imagestreams.py rename to 4.0/test/test_ocp_s2i_imagestreams.py diff --git a/3.3/test/test_ocp_s2i_integration.py b/4.0/test/test_ocp_s2i_integration.py similarity index 100% rename from 3.3/test/test_ocp_s2i_integration.py rename to 4.0/test/test_ocp_s2i_integration.py diff --git a/3.3/test/test_ocp_s2i_templates.py b/4.0/test/test_ocp_s2i_templates.py similarity index 100% rename from 3.3/test/test_ocp_s2i_templates.py rename to 4.0/test/test_ocp_s2i_templates.py From 87695b37dacde9d8c4150420f14ec84b34da2652 Mon Sep 17 00:00:00 2001 From: Jarek Prokop Date: Mon, 12 Jan 2026 12:08:47 +0100 Subject: [PATCH 2/7] Re-add 3.3 back. --- 3.3/.exclude-c9s | 0 3.3/Dockerfile.c10s | 65 +++++ 3.3/Dockerfile.c9s | 66 +++++ 3.3/Dockerfile.fedora | 52 ++++ 3.3/Dockerfile.rhel10 | 64 +++++ 3.3/Dockerfile.rhel8 | 65 +++++ 3.3/Dockerfile.rhel9 | 65 +++++ 3.3/README.md | 229 ++++++++++++++++++ 3.3/root/opt/app-root/.gemrc | 9 + 3.3/root/opt/app-root/etc/puma.cfg | 50 ++++ 3.3/s2i/bin/assemble | 68 ++++++ 3.3/s2i/bin/run | 39 +++ 3.3/s2i/bin/usage | 18 ++ 3.3/test/__init__.py | 1 + 3.3/test/conftest.py | 1 + 3.3/test/examples | 1 + 3.3/test/imagestreams | 1 + 3.3/test/puma-test-app/Gemfile | 4 + 3.3/test/puma-test-app/Gemfile.lock | 25 ++ 3.3/test/puma-test-app/app.rb | 5 + 3.3/test/puma-test-app/config.ru | 2 + 3.3/test/rack-test-app/Gemfile | 4 + 3.3/test/rack-test-app/Gemfile.lock | 23 ++ 3.3/test/rack-test-app/app.rb | 5 + 3.3/test/rack-test-app/config.ru | 2 + 3.3/test/run | 1 + 3.3/test/run-openshift-pytest | 1 + 3.3/test/run-pytest | 1 + 3.3/test/test-fips/Gemfile | 13 + 3.3/test/test-fips/app.rb | 72 ++++++ 3.3/test/test-fips/config.ru | 2 + 3.3/test/test-lib-openshift.sh | 1 + 3.3/test/test-lib-remote-openshift.sh | 1 + 3.3/test/test-lib.sh | 1 + 3.3/test/test-openshift.yaml | 1 + 3.3/test/test_container_application.py | 1 + 3.3/test/test_container_basics.py | 1 + 3.3/test/test_container_fips.py | 1 + 3.3/test/test_ocp_helm_ruby_imagestreams.py | 1 + .../test_ocp_helm_ruby_rails_application.py | 1 + 3.3/test/test_ocp_ruby_ex_standalone.py | 1 + 3.3/test/test_ocp_ruby_latest_imagestreams.py | 1 + 3.3/test/test_ocp_s2i_imagestreams.py | 1 + 3.3/test/test_ocp_s2i_integration.py | 1 + 3.3/test/test_ocp_s2i_templates.py | 1 + 45 files changed, 968 insertions(+) create mode 100644 3.3/.exclude-c9s create mode 100644 3.3/Dockerfile.c10s create mode 100644 3.3/Dockerfile.c9s create mode 100644 3.3/Dockerfile.fedora create mode 100644 3.3/Dockerfile.rhel10 create mode 100644 3.3/Dockerfile.rhel8 create mode 100644 3.3/Dockerfile.rhel9 create mode 100644 3.3/README.md create mode 100644 3.3/root/opt/app-root/.gemrc create mode 100644 3.3/root/opt/app-root/etc/puma.cfg create mode 100755 3.3/s2i/bin/assemble create mode 100755 3.3/s2i/bin/run create mode 100755 3.3/s2i/bin/usage create mode 120000 3.3/test/__init__.py create mode 120000 3.3/test/conftest.py create mode 120000 3.3/test/examples create mode 120000 3.3/test/imagestreams create mode 100755 3.3/test/puma-test-app/Gemfile create mode 100644 3.3/test/puma-test-app/Gemfile.lock create mode 100755 3.3/test/puma-test-app/app.rb create mode 100755 3.3/test/puma-test-app/config.ru create mode 100755 3.3/test/rack-test-app/Gemfile create mode 100644 3.3/test/rack-test-app/Gemfile.lock create mode 100755 3.3/test/rack-test-app/app.rb create mode 100755 3.3/test/rack-test-app/config.ru create mode 120000 3.3/test/run create mode 120000 3.3/test/run-openshift-pytest create mode 120000 3.3/test/run-pytest create mode 100644 3.3/test/test-fips/Gemfile create mode 100644 3.3/test/test-fips/app.rb create mode 100644 3.3/test/test-fips/config.ru create mode 120000 3.3/test/test-lib-openshift.sh create mode 120000 3.3/test/test-lib-remote-openshift.sh create mode 120000 3.3/test/test-lib.sh create mode 120000 3.3/test/test-openshift.yaml create mode 120000 3.3/test/test_container_application.py create mode 120000 3.3/test/test_container_basics.py create mode 120000 3.3/test/test_container_fips.py create mode 120000 3.3/test/test_ocp_helm_ruby_imagestreams.py create mode 120000 3.3/test/test_ocp_helm_ruby_rails_application.py create mode 120000 3.3/test/test_ocp_ruby_ex_standalone.py create mode 120000 3.3/test/test_ocp_ruby_latest_imagestreams.py create mode 120000 3.3/test/test_ocp_s2i_imagestreams.py create mode 120000 3.3/test/test_ocp_s2i_integration.py create mode 120000 3.3/test/test_ocp_s2i_templates.py diff --git a/3.3/.exclude-c9s b/3.3/.exclude-c9s new file mode 100644 index 00000000..e69de29b diff --git a/3.3/Dockerfile.c10s b/3.3/Dockerfile.c10s new file mode 100644 index 00000000..edd3c2d6 --- /dev/null +++ b/3.3/Dockerfile.c10s @@ -0,0 +1,65 @@ +FROM quay.io/sclorg/s2i-base-c10s:c10s + +# This image provides a Ruby environment you can use to run your Ruby +# applications. + +EXPOSE 8080 + +ENV RUBY_MAJOR_VERSION=3 \ + RUBY_MINOR_VERSION=3 + +ENV RUBY_VERSION="${RUBY_MAJOR_VERSION}.${RUBY_MINOR_VERSION}" \ + RUBY_SCL_NAME_VERSION="${RUBY_MAJOR_VERSION}${RUBY_MINOR_VERSION}" + +ENV RUBY_SCL="ruby-${RUBY_SCL_NAME_VERSION}" \ + IMAGE_NAME="sclorg/ruby-${RUBY_SCL_NAME_VERSION}-c10s" \ + SUMMARY="Platform for building and running Ruby $RUBY_VERSION applications" \ + DESCRIPTION="Ruby $RUBY_VERSION available as container is a base platform for \ +building and running various Ruby $RUBY_VERSION applications and frameworks. \ +Ruby is the interpreted scripting language for quick and easy object-oriented programming. \ +It has many features to process text files and to do system management tasks (as in Perl). \ +It is simple, straight-forward, and extensible." + +LABEL summary="$SUMMARY" \ + description="$DESCRIPTION" \ + io.k8s.description="$DESCRIPTION" \ + io.k8s.display-name="Ruby ${RUBY_VERSION}" \ + io.openshift.expose-services="8080:http" \ + io.openshift.tags="builder,ruby,ruby${RUBY_SCL_NAME_VERSION},${RUBY_SCL}" \ + com.redhat.component="${RUBY_SCL}-container" \ + name="${IMAGE_NAME}" \ + version="1" \ + com.redhat.license_terms="https://www.redhat.com/en/about/red-hat-end-user-license-agreements#UBI" \ + usage="s2i build https://github.com/sclorg/s2i-ruby-container.git \ +--context-dir=${RUBY_VERSION}/test/puma-test-app/ ${IMAGE_NAME} ruby-sample-app" \ + maintainer="SoftwareCollections.org " + +RUN INSTALL_PKGS=" \ + libffi-devel \ + ruby \ + ruby-devel \ + rubygem-rake \ + rubygem-bundler \ + ruby-bundled-gems \ + redhat-rpm-config \ + " && \ + dnf install -y --setopt=tsflags=nodocs ${INSTALL_PKGS} && \ + dnf reinstall -y --setopt=tsflags=nodocs tzdata && \ + dnf -y clean all --enablerepo='*' && \ + ruby -v | grep -qe "^ruby $RUBY_VERSION\." && echo "Found VERSION $RUBY_VERSION" && \ + rpm -V ${INSTALL_PKGS} + +# Copy the S2I scripts from the specific language image to $STI_SCRIPTS_PATH +COPY ./s2i/bin/ $STI_SCRIPTS_PATH + +# Copy extra files to the image. +COPY ./root/ / + +# Drop the root user and make the content of /opt/app-root owned by user 1001 +RUN chown -R 1001:0 ${APP_ROOT} && chmod -R ug+rwx ${APP_ROOT} && \ + rpm-file-permissions + +USER 1001 + +# Set the default CMD to print the usage of the language image +CMD $STI_SCRIPTS_PATH/usage diff --git a/3.3/Dockerfile.c9s b/3.3/Dockerfile.c9s new file mode 100644 index 00000000..d12412bb --- /dev/null +++ b/3.3/Dockerfile.c9s @@ -0,0 +1,66 @@ +FROM quay.io/sclorg/s2i-base-c9s:c9s + +# This image provides a Ruby environment you can use to run your Ruby +# applications. + +EXPOSE 8080 + +ENV RUBY_MAJOR_VERSION=3 \ + RUBY_MINOR_VERSION=3 + +ENV RUBY_VERSION="${RUBY_MAJOR_VERSION}.${RUBY_MINOR_VERSION}" \ + RUBY_SCL_NAME_VERSION="${RUBY_MAJOR_VERSION}${RUBY_MINOR_VERSION}" + +ENV RUBY_SCL="ruby-${RUBY_SCL_NAME_VERSION}" \ + IMAGE_NAME="ubi8/ruby-${RUBY_SCL_NAME_VERSION}" \ + SUMMARY="Platform for building and running Ruby $RUBY_VERSION applications" \ + DESCRIPTION="Ruby $RUBY_VERSION available as container is a base platform for \ +building and running various Ruby $RUBY_VERSION applications and frameworks. \ +Ruby is the interpreted scripting language for quick and easy object-oriented programming. \ +It has many features to process text files and to do system management tasks (as in Perl). \ +It is simple, straight-forward, and extensible." + +LABEL summary="$SUMMARY" \ + description="$DESCRIPTION" \ + io.k8s.description="$DESCRIPTION" \ + io.k8s.display-name="Ruby ${RUBY_VERSION}" \ + io.openshift.expose-services="8080:http" \ + io.openshift.tags="builder,ruby,ruby${RUBY_SCL_NAME_VERSION},${RUBY_SCL}" \ + com.redhat.component="${RUBY_SCL}-container" \ + name="${IMAGE_NAME}" \ + version="1" \ + com.redhat.license_terms="https://www.redhat.com/en/about/red-hat-end-user-license-agreements#UBI" \ + usage="s2i build https://github.com/sclorg/s2i-ruby-container.git \ +--context-dir=${RUBY_VERSION}/test/puma-test-app/ ${IMAGE_NAME} ruby-sample-app" \ + maintainer="SoftwareCollections.org " + +RUN dnf -y module enable ruby:$RUBY_VERSION && \ + INSTALL_PKGS=" \ + libffi-devel \ + ruby \ + ruby-devel \ + rubygem-rake \ + rubygem-bundler \ + ruby-bundled-gems \ + redhat-rpm-config \ + " && \ + dnf install -y --setopt=tsflags=nodocs ${INSTALL_PKGS} && \ + dnf reinstall -y --setopt=tsflags=nodocs tzdata && \ + dnf -y clean all --enablerepo='*' && \ + ruby -v | grep -qe "^ruby $RUBY_VERSION\." && echo "Found VERSION $RUBY_VERSION" && \ + rpm -V ${INSTALL_PKGS} + +# Copy the S2I scripts from the specific language image to $STI_SCRIPTS_PATH +COPY ./s2i/bin/ $STI_SCRIPTS_PATH + +# Copy extra files to the image. +COPY ./root/ / + +# Drop the root user and make the content of /opt/app-root owned by user 1001 +RUN chown -R 1001:0 ${APP_ROOT} && chmod -R ug+rwx ${APP_ROOT} && \ + rpm-file-permissions + +USER 1001 + +# Set the default CMD to print the usage of the language image +CMD $STI_SCRIPTS_PATH/usage diff --git a/3.3/Dockerfile.fedora b/3.3/Dockerfile.fedora new file mode 100644 index 00000000..bd2d64fd --- /dev/null +++ b/3.3/Dockerfile.fedora @@ -0,0 +1,52 @@ +FROM quay.io/fedora/s2i-base:40 + +# This image provides a Ruby environment you can use to run your Ruby +# applications. + +EXPOSE 8080 + +ENV NAME=ruby \ + RUBY_VERSION=3.3 \ + RUBY_SHORT_VER=33 \ + VERSION= + +ENV SUMMARY="Platform for building and running Ruby $RUBY_VERSION applications" \ + DESCRIPTION="Ruby $RUBY_VERSION available as container is a base platform for \ +building and running various Ruby $RUBY_VERSION applications and frameworks. \ +Ruby is the interpreted scripting language for quick and easy object-oriented programming. \ +It has many features to process text files and to do system management tasks (as in Perl). \ +It is simple, straight-forward, and extensible." + +LABEL summary="$SUMMARY" \ + description="$DESCRIPTION" \ + io.k8s.description="$DESCRIPTION" \ + io.k8s.display-name="Ruby ${RUBY_VERSION}" \ + io.openshift.expose-services="8080:http" \ + io.openshift.tags="builder,ruby,ruby${RUBY_SHORT_VER}" \ + com.redhat.component="$NAME" \ + name="fedora/$NAME-$RUBY_SHORT_VER" \ + version="0" \ + usage="s2i build https://github.com/sclorg/s2i-ruby-container.git --context-dir=${RUBY_VERSION}/test/puma-test-app/ quay.io/fedora/$NAME-$RUBY_SHORT_VER ruby-sample-app" \ + maintainer="SoftwareCollections.org " + +# Install required packages +RUN INSTALL_PKGS="ruby ruby-devel rubygem-bundler ruby-bundled-gems rubygem-rake rubygems-devel redhat-rpm-config libffi-devel" && \ + dnf install -y --setopt=tsflags=nodocs $INSTALL_PKGS && \ + rpm -V $INSTALL_PKGS && \ + ruby -v | grep -qe "^ruby $RUBY_VERSION\." && echo "Found VERSION $RUBY_VERSION" && \ + dnf clean all + +# Copy the S2I scripts from the specific language image to $STI_SCRIPTS_PATH +COPY ./s2i/bin/ $STI_SCRIPTS_PATH + +# Copy extra files to the image. +COPY ./root/ / + +# Drop the root user and make the content of /opt/app-root owned by user 1001 +RUN chown -R 1001:0 ${APP_ROOT} && chmod -R ug+rwx ${APP_ROOT} && \ + rpm-file-permissions + +USER 1001 + +# Set the default CMD to print the usage of the language image +CMD $STI_SCRIPTS_PATH/usage diff --git a/3.3/Dockerfile.rhel10 b/3.3/Dockerfile.rhel10 new file mode 100644 index 00000000..ef0edbd7 --- /dev/null +++ b/3.3/Dockerfile.rhel10 @@ -0,0 +1,64 @@ +FROM ubi10/s2i-base + +# This image provides a Ruby environment you can use to run your Ruby +# applications. + +EXPOSE 8080 + +ENV RUBY_MAJOR_VERSION=3 \ + RUBY_MINOR_VERSION=3 + +ENV RUBY_VERSION="${RUBY_MAJOR_VERSION}.${RUBY_MINOR_VERSION}" \ + RUBY_SCL_NAME_VERSION="${RUBY_MAJOR_VERSION}${RUBY_MINOR_VERSION}" + +ENV RUBY_SCL="ruby-${RUBY_SCL_NAME_VERSION}" \ + IMAGE_NAME="ubi10/ruby-${RUBY_SCL_NAME_VERSION}" \ + SUMMARY="Platform for building and running Ruby $RUBY_VERSION applications" \ + DESCRIPTION="Ruby $RUBY_VERSION available as container is a base platform for \ +building and running various Ruby $RUBY_VERSION applications and frameworks. \ +Ruby is the interpreted scripting language for quick and easy object-oriented programming. \ +It has many features to process text files and to do system management tasks (as in Perl). \ +It is simple, straight-forward, and extensible." + +LABEL summary="$SUMMARY" \ + description="$DESCRIPTION" \ + io.k8s.description="$DESCRIPTION" \ + io.k8s.display-name="Ruby ${RUBY_VERSION}" \ + io.openshift.expose-services="8080:http" \ + io.openshift.tags="builder,ruby,ruby${RUBY_SCL_NAME_VERSION},${RUBY_SCL}" \ + com.redhat.component="${RUBY_SCL}-container" \ + name="${IMAGE_NAME}" \ + com.redhat.license_terms="https://www.redhat.com/en/about/red-hat-end-user-license-agreements#UBI" \ + usage="s2i build https://github.com/sclorg/s2i-ruby-container.git \ +--context-dir=${RUBY_VERSION}/test/puma-test-app/ ${IMAGE_NAME} ruby-sample-app" \ + maintainer="SoftwareCollections.org " + +RUN INSTALL_PKGS=" \ + libffi-devel \ + ruby \ + ruby-devel \ + rubygem-rake \ + rubygem-bundler \ + ruby-bundled-gems \ + redhat-rpm-config \ + " && \ + dnf install -y --setopt=tsflags=nodocs ${INSTALL_PKGS} && \ + dnf reinstall -y --setopt=tsflags=nodocs tzdata && \ + dnf -y clean all --enablerepo='*' && \ + ruby -v | grep -qe "^ruby $RUBY_VERSION\." && echo "Found VERSION $RUBY_VERSION" && \ + rpm -V ${INSTALL_PKGS} + +# Copy the S2I scripts from the specific language image to $STI_SCRIPTS_PATH +COPY ./s2i/bin/ $STI_SCRIPTS_PATH + +# Copy extra files to the image. +COPY ./root/ / + +# Drop the root user and make the content of /opt/app-root owned by user 1001 +RUN chown -R 1001:0 ${APP_ROOT} && chmod -R ug+rwx ${APP_ROOT} && \ + rpm-file-permissions + +USER 1001 + +# Set the default CMD to print the usage of the language image +CMD $STI_SCRIPTS_PATH/usage diff --git a/3.3/Dockerfile.rhel8 b/3.3/Dockerfile.rhel8 new file mode 100644 index 00000000..930bf782 --- /dev/null +++ b/3.3/Dockerfile.rhel8 @@ -0,0 +1,65 @@ +FROM ubi8/s2i-base + +# This image provides a Ruby environment you can use to run your Ruby +# applications. + +EXPOSE 8080 + +ENV RUBY_MAJOR_VERSION=3 \ + RUBY_MINOR_VERSION=3 + +ENV RUBY_VERSION="${RUBY_MAJOR_VERSION}.${RUBY_MINOR_VERSION}" \ + RUBY_SCL_NAME_VERSION="${RUBY_MAJOR_VERSION}${RUBY_MINOR_VERSION}" + +ENV RUBY_SCL="ruby-${RUBY_SCL_NAME_VERSION}" \ + IMAGE_NAME="ubi8/ruby-${RUBY_SCL_NAME_VERSION}" \ + SUMMARY="Platform for building and running Ruby $RUBY_VERSION applications" \ + DESCRIPTION="Ruby $RUBY_VERSION available as container is a base platform for \ +building and running various Ruby $RUBY_VERSION applications and frameworks. \ +Ruby is the interpreted scripting language for quick and easy object-oriented programming. \ +It has many features to process text files and to do system management tasks (as in Perl). \ +It is simple, straight-forward, and extensible." + +LABEL summary="$SUMMARY" \ + description="$DESCRIPTION" \ + io.k8s.description="$DESCRIPTION" \ + io.k8s.display-name="Ruby ${RUBY_VERSION}" \ + io.openshift.expose-services="8080:http" \ + io.openshift.tags="builder,ruby,ruby${RUBY_SCL_NAME_VERSION},${RUBY_SCL}" \ + com.redhat.component="${RUBY_SCL}-container" \ + name="${IMAGE_NAME}" \ + version="1" \ + com.redhat.license_terms="https://www.redhat.com/en/about/red-hat-end-user-license-agreements#UBI" \ + usage="s2i build https://github.com/sclorg/s2i-ruby-container.git \ +--context-dir=${RUBY_VERSION}/test/puma-test-app/ ${IMAGE_NAME} ruby-sample-app" \ + maintainer="SoftwareCollections.org " + +RUN yum -y module enable ruby:$RUBY_VERSION && \ + INSTALL_PKGS=" \ + libffi-devel \ + ruby \ + ruby-devel \ + rubygem-rake \ + rubygem-bundler \ + ruby-bundled-gems \ + redhat-rpm-config \ + " && \ + yum install -y --setopt=tsflags=nodocs ${INSTALL_PKGS} && \ + yum -y clean all --enablerepo='*' && \ + ruby -v | grep -qe "^ruby $RUBY_VERSION\." && echo "Found VERSION $RUBY_VERSION" && \ + rpm -V ${INSTALL_PKGS} + +# Copy the S2I scripts from the specific language image to $STI_SCRIPTS_PATH +COPY ./s2i/bin/ $STI_SCRIPTS_PATH + +# Copy extra files to the image. +COPY ./root/ / + +# Drop the root user and make the content of /opt/app-root owned by user 1001 +RUN chown -R 1001:0 ${APP_ROOT} && chmod -R ug+rwx ${APP_ROOT} && \ + rpm-file-permissions + +USER 1001 + +# Set the default CMD to print the usage of the language image +CMD $STI_SCRIPTS_PATH/usage diff --git a/3.3/Dockerfile.rhel9 b/3.3/Dockerfile.rhel9 new file mode 100644 index 00000000..61bc8907 --- /dev/null +++ b/3.3/Dockerfile.rhel9 @@ -0,0 +1,65 @@ +FROM ubi9/s2i-base + +# This image provides a Ruby environment you can use to run your Ruby +# applications. + +EXPOSE 8080 + +ENV RUBY_MAJOR_VERSION=3 \ + RUBY_MINOR_VERSION=3 + +ENV RUBY_VERSION="${RUBY_MAJOR_VERSION}.${RUBY_MINOR_VERSION}" \ + RUBY_SCL_NAME_VERSION="${RUBY_MAJOR_VERSION}${RUBY_MINOR_VERSION}" + +ENV RUBY_SCL="ruby-${RUBY_SCL_NAME_VERSION}" \ + IMAGE_NAME="ubi9/ruby-${RUBY_SCL_NAME_VERSION}" \ + SUMMARY="Platform for building and running Ruby $RUBY_VERSION applications" \ + DESCRIPTION="Ruby $RUBY_VERSION available as container is a base platform for \ +building and running various Ruby $RUBY_VERSION applications and frameworks. \ +Ruby is the interpreted scripting language for quick and easy object-oriented programming. \ +It has many features to process text files and to do system management tasks (as in Perl). \ +It is simple, straight-forward, and extensible." + +LABEL summary="$SUMMARY" \ + description="$DESCRIPTION" \ + io.k8s.description="$DESCRIPTION" \ + io.k8s.display-name="Ruby ${RUBY_VERSION}" \ + io.openshift.expose-services="8080:http" \ + io.openshift.tags="builder,ruby,ruby${RUBY_SCL_NAME_VERSION},${RUBY_SCL}" \ + com.redhat.component="${RUBY_SCL}-container" \ + name="${IMAGE_NAME}" \ + version="1" \ + com.redhat.license_terms="https://www.redhat.com/en/about/red-hat-end-user-license-agreements#UBI" \ + usage="s2i build https://github.com/sclorg/s2i-ruby-container.git \ +--context-dir=${RUBY_VERSION}/test/puma-test-app/ ${IMAGE_NAME} ruby-sample-app" \ + maintainer="SoftwareCollections.org " + +RUN dnf -y module enable ruby:$RUBY_VERSION && \ + INSTALL_PKGS=" \ + libffi-devel \ + ruby \ + ruby-devel \ + rubygem-rake \ + rubygem-bundler \ + ruby-bundled-gems \ + redhat-rpm-config \ + " && \ + dnf install -y --setopt=tsflags=nodocs ${INSTALL_PKGS} && \ + dnf -y clean all --enablerepo='*' && \ + ruby -v | grep -qe "^ruby $RUBY_VERSION\." && echo "Found VERSION $RUBY_VERSION" && \ + rpm -V ${INSTALL_PKGS} + +# Copy the S2I scripts from the specific language image to $STI_SCRIPTS_PATH +COPY ./s2i/bin/ $STI_SCRIPTS_PATH + +# Copy extra files to the image. +COPY ./root/ / + +# Drop the root user and make the content of /opt/app-root owned by user 1001 +RUN chown -R 1001:0 ${APP_ROOT} && chmod -R ug+rwx ${APP_ROOT} && \ + rpm-file-permissions + +USER 1001 + +# Set the default CMD to print the usage of the language image +CMD $STI_SCRIPTS_PATH/usage diff --git a/3.3/README.md b/3.3/README.md new file mode 100644 index 00000000..73d26dda --- /dev/null +++ b/3.3/README.md @@ -0,0 +1,229 @@ +Ruby 3.3 container image +======================== +This container image includes Ruby 3.3 as a [S2I](https://github.com/openshift/source-to-image) base image for your Ruby 3.3 applications. +Users can choose between RHEL, CentOS Stream and Fedora based builder images. +The RHEL images are available in the [Red Hat Container Catalog](https://access.redhat.com/containers/), +the CentOS Stream images are available on [Quay.io](https://quay.io/organization/sclorg), +and the Fedora images are available in [Quay.io](https://quay.io/organization/fedora). +The resulting image can be run using [podman](https://github.com/containers/libpod). + +Note: while the examples in this README are calling `podman`, you can replace any such calls by `docker` with the same arguments + +Description +----------- + +Ruby 3.3 available as container is a base platform for +building and running various Ruby 3.3 applications and frameworks. +Ruby is the interpreted scripting language for quick and easy object-oriented programming. +It has many features to process text files and to do system management tasks (as in Perl). +It is simple, straight-forward, and extensible. + +This container image includes an npm utility, so users can use it to install JavaScript +modules for their web applications. There is no guarantee for any specific npm or nodejs +version, that is included in the image; those versions can be changed anytime and +the nodejs itself is included just to make the npm work. + +Usage in Openshift +------------------ +For this, we will assume that you are using the `ubi10/ruby-33 image`, available via `ruby:3.3` imagestream tag in Openshift. +Building a simple [ruby-sample-app](https://github.com/sclorg/s2i-ruby-container/tree/master/3.3/test/puma-test-app) application +in Openshift can be achieved with the following step: + + ``` + oc new-app ruby:3.3~https://github.com/sclorg/rails-ex.git + ``` + +**Accessing the application:** +``` +$ oc get pods +$ oc exec -- curl 127.0.0.1:8080 +``` + +Source-to-Image framework and scripts +------------------------------------- +This image supports the [Source-to-Image](https://docs.openshift.com/container-platform/4.4/builds/build-strategies.html#images-create-s2i_build-strategies) +(S2I) strategy in OpenShift. The Source-to-Image is an OpenShift framework +which makes it easy to write images that take application source code as +an input, use a builder image like this Ruby container image, and produce +a new image that runs the assembled application as an output. + +To support the Source-to-Image framework, important scripts are included in the builder image: + +* The `/usr/libexec/s2i/assemble` script inside the image is run to produce a new image with the application artifacts. The script takes sources of a given application and places them into appropriate directories inside the image. It utilizes some common patterns in Ruby application development (see the **Environment variables** section below). +* The `/usr/libexec/s2i/run` script is set as the default command in the resulting container image (the new image with the application artifacts). It configures web server and runs this server on port 8080. + +Building an application using a Dockerfile +------------------------------------------ +Compared to the Source-to-Image strategy, using a Dockerfile is a more +flexible way to build a Ruby container image with an application. +Use a Dockerfile when Source-to-Image is not sufficiently flexible for you or +when you build the image outside of the OpenShift environment. + +To use the Ruby image in a Dockerfile, follow these steps: + +#### 1. Pull a base builder image to build on + +``` +podman pull ubi10/ruby-33 +``` + +An RHEL10 image `ubi10/ruby-33` is used in this example. + +#### 2. Pull and application code + + An example application available at https://github.com/sclorg/rails-ex.git is used here. Feel free to clone the repository for further experiments. + +``` +git clone https://github.com/sclorg/rails-ex.git app-src +``` + +#### 3. Prepare an application inside a container + +This step usually consists of at least these parts: + +* putting the application source into the container +* installing the dependencies +* setting the default command in the resulting image + +For all these three parts, users can use the Source-to-Image scripts inside the image ([3.3.](#33-to-use-the-source-to-image-scripts-and-build-an-image-using-a-dockerfile-create-a-dockerfile-with-this-content)), or users can either setup all manually and use commands `ruby`, `bundle` and `rackup` explicitly in the Dockerfile ([3.3.](#33-to-use-your-own-setup-create-a-dockerfile-with-this-content)) + +##### 3.3 To use the Source-to-Image scripts and build an image using a Dockerfile, create a Dockerfile with this content: +``` +FROM ubi10/ruby-33 + +# Add application sources to a directory that the assemble scriptexpects them +# and set permissions so that the container runs without root access +USER 0 +ADD app-src /tmp/src +RUN chown -R 1001:0 /tmp/src +USER 1001 + +# Set up development mode +ENV RAILS_ENV=development + +# Install the dependencies +RUN /usr/libexec/s2i/assemble + +# Set the default command for the resulting image +CMD /usr/libexec/s2i/run +``` +The s2i scripts are used to set-up and run common Ruby applications. More information about the scripts can be found in [Source-to-Image](#source-to-image-framework-and-scripts) section. +##### 3.3 To use your own setup, create a Dockerfile with this content: +``` +FROM ubi10/ruby-33 + +USER 0 +ADD app-src ./ +RUN bundle install --path ./bundle + +CMD bundle exec "rackup -P /tmp/rack.pid --host 0.0.0.0 --port 8080" +``` +#### 4. Build a new image from a Dockerfile prepared in the previous step + +``` +podman build -t ruby-app . +``` + +#### 5. Run the resulting image with final application +``` +podman run -d ruby-app +``` +Environment variables +--------------------- + +To set these environment variables, you can place them as a key value pair into a `.s2i/environment` +file inside your source code repository. + +* **RACK_ENV** + + This variable specifies the environment where the Ruby application will be deployed (unless overwritten) - `production`, `development`, `test`. + Each level has different behaviors in terms of logging verbosity, error pages, ruby gem installation, etc. + + **Note**: Application assets will be compiled only if the `RACK_ENV` is set to `production` + +* **DISABLE_ASSET_COMPILATION** + + This variable set to `true` indicates that the asset compilation process will be skipped. Since this only takes place + when the application is run in the `production` environment, it should only be used when assets are already compiled. + +* **PUMA_MIN_THREADS**, **PUMA_MAX_THREADS** + + These variables indicate the minimum and maximum threads that will be available in [Puma](https://github.com/puma/puma)'s thread pool. + +* **PUMA_WORKERS** + + This variable indicate the number of worker processes that will be launched. See documentation on Puma's [clustered mode](https://github.com/puma/puma#clustered-mode). + +* **RUBYGEM_MIRROR** + + Set this variable to use a custom RubyGems mirror URL to download required gem packages during build process. + +Hot deploy +---------- +In order to dynamically pick up changes made in your application source code, you need to make following steps: + +* **For Ruby on Rails applications** + + Run the built Rails image with the `RAILS_ENV=development` environment variable passed to the [podman](https://github.com/containers/libpod) `-e` run flag: + ``` + $ podman run -e RAILS_ENV=development -p 8080:8080 rails-app + ``` +* **For other types of Ruby applications (Sinatra, Padrino, etc.)** + + Your application needs to be built with one of gems that reloads the server every time changes in source code are done inside the running container. Those gems are: + * [Shotgun](https://github.com/rtomayko/shotgun) + * [Rerun](https://github.com/alexch/rerun) + * [Rack-livereload](https://github.com/johnbintz/rack-livereload) + + Please note that in order to be able to run your application in development mode, you need to modify the [S2I run script](https://github.com/openshift/source-to-image#anatomy-of-a-builder-image), so the web server is launched by the chosen gem, which checks for changes in the source code. + + After you built your application image with your version of [S2I run script](https://github.com/openshift/source-to-image#anatomy-of-a-builder-image), run the image with the RACK_ENV=development environment variable passed to the [podman](https://github.com/containers/libpod) -e run flag: + ``` + $ podman run -e RACK_ENV=development -p 8080:8080 sinatra-app + ``` + +To change your source code in running container, use Podman's [exec](https://github.com/containers/libpod) command: +``` +$ podman exec -it /bin/bash +``` + +After you [podman exec](https://github.com/containers/libpod) into the running container, your current +directory is set to `/opt/app-root/src`, where the source code is located. + +Performance tuning +------------------ +You can tune the number of threads per worker using the +`PUMA_MIN_THREADS` and `PUMA_MAX_THREADS` environment variables. +Additionally, the number of worker processes is determined by the number of CPU +cores that the container has available, as recommended by +[Puma](https://github.com/puma/puma)'s documentation. This is determined using +the cgroup [cpusets](https://www.kernel.org/doc/Documentation/cgroup-v1/cpusets.txt) +subsystem. You can specify the cores that the container is allowed to use by passing +the `--cpuset-cpus` parameter to the [podman](https://github.com/containers/libpod) run command: +``` +$ podman run -e PUMA_MAX_THREADS=32 --cpuset-cpus='0-2,3,5' -p 8080:8080 sinatra-app +``` +The number of workers is also limited by the memory limit that is enforced using +cgroups. The builder image assumes that you will need 50 MiB as a base and +another 15 MiB for every worker process plus 128 KiB for each thread. Note that +each worker has its own threads, so the total memory required for the whole +container is computed using the following formula: + +``` +50 + 15 * WORKERS + 0.125 * WORKERS * PUMA_MAX_THREADS +``` +You can specify a memory limit using the `--memory` flag: +``` +$ podman run -e PUMA_MAX_THREADS=32 --memory=300m -p 8080:8080 sinatra-app +``` +If memory is more limiting then the number of available cores, the number of +workers is scaled down accordingly to fit the above formula. The number of +workers can also be set explicitly by setting `PUMA_WORKERS`. + + +See also +-------- +Dockerfile and other sources are available on https://github.com/sclorg/s2i-ruby-container. +In that repository you also can find another versions of Ruby environment Dockerfiles. +The Dockerfile for RHEL8 is called `Dockerfile.rhel8`, for RHEL9 it's `Dockerfile.rhel9`, +for RHEL10 it's `Dockerfile.rhel10`, for CentOS Stream 10 it's `Dockerfile.c10s` and the Fedora Dockerfile is called Dockerfile.fedora. diff --git a/3.3/root/opt/app-root/.gemrc b/3.3/root/opt/app-root/.gemrc new file mode 100644 index 00000000..2422bea3 --- /dev/null +++ b/3.3/root/opt/app-root/.gemrc @@ -0,0 +1,9 @@ +--- +install: --no-document +update: --no-document +:benchmark: false +:update_sources: true +:bulk_threshold: 1000 +:backtrace: true +:sources: +- https://rubygems.org/ diff --git a/3.3/root/opt/app-root/etc/puma.cfg b/3.3/root/opt/app-root/etc/puma.cfg new file mode 100644 index 00000000..a52d26dc --- /dev/null +++ b/3.3/root/opt/app-root/etc/puma.cfg @@ -0,0 +1,50 @@ +def get_max_memory() + return ENV['MEMORY_LIMIT_IN_BYTES'].to_i if ENV.has_key? 'MEMORY_LIMIT_IN_BYTES' + + # Assume unlimited memory. 0.size is the number of bytes a Ruby + # Fixnum class can hold. One bit is used for sign and one is used + # by Ruby to determine whether it's a number or pointer to an object. + # That's why we subtract two bits. This expresion should therefore be + # the largest signed Fixnum possible. + (2 ** (8*0.size - 2) - 1) +end + +def get_memory_per_worker() + bytes = ENV.fetch('MEMORY_BYTES_PER_WORKER', '0').to_i + if bytes == 0 + # Comment describing rationale for choosing default of 256MiB/worker is below. + bytes = 256 * (2**20) + end + bytes +end + +def get_min_threads() + ENV.fetch('PUMA_MIN_THREADS', '0').to_i +end + +def get_max_threads() + ENV.fetch('PUMA_MAX_THREADS', '16').to_i +end + +# Determine the maximum number of workers that are allowed by the available +# memory. Puma documentation recommends the maximum number of workers to be +# set to the number of cores. +# Unless we're specifically tuned otherwise, allow one worker process per 256MiB +# memory, to a maximum of 1 worker / core. Hopefully that'll be a reasonable +# starting point for average apps; if not, it's all tunable. The simple +# OpenShift ruby/rails sample app currently requires approx. 60MiB + +# 70MiB/worker before taking its first request, so hopefully a default of +# 256MiB/worker will give other simple apps reasonable default headroom. +def get_workers() + return ENV['PUMA_WORKERS'].to_i if ENV.has_key? 'PUMA_WORKERS' + + cores = ENV.fetch('NUMBER_OF_CORES', '1').to_i + max_workers = get_max_memory() / get_memory_per_worker() + + [cores, max_workers].min +end + +environment ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'production' +threads get_min_threads(), get_max_threads() +workers get_workers() +bind 'tcp://0.0.0.0:8080' diff --git a/3.3/s2i/bin/assemble b/3.3/s2i/bin/assemble new file mode 100755 index 00000000..5c9d32d4 --- /dev/null +++ b/3.3/s2i/bin/assemble @@ -0,0 +1,68 @@ +#!/bin/bash + +function rake_assets_precompile() { + [[ "$DISABLE_ASSET_COMPILATION" == "true" ]] && return + [ ! -f Gemfile ] && return + [ ! -f Rakefile ] && return + ! grep " rake " Gemfile.lock >/dev/null && return + ! bundle exec 'rake -T' | grep "assets:precompile" >/dev/null && return + + echo "---> Starting asset compilation ..." + bundle exec "rake assets:precompile" +} + +set -e + +export RACK_ENV=${RACK_ENV:-"production"} + +if [ -n "$RUBYGEM_MIRROR" ]; then + bundle config mirror.https://rubygems.org $RUBYGEM_MIRROR +fi + +shopt -s dotglob +echo "---> Installing application source ..." +mv /tmp/src/* ./ + +# Change the npm registry mirror if provided +if [ -n "$NPM_MIRROR" ]; then + npm config set registry $NPM_MIRROR +fi + +echo "---> Building your Ruby application from source ..." +if [ -f Gemfile ]; then + ADDTL_BUNDLE_ARGS="--retry 2" + if [ -f Gemfile.lock ]; then + bundle config set --local deployment "true" + fi + + if [[ "$RAILS_ENV" == "development" || "$RACK_ENV" == "development" ]]; then + BUNDLE_WITHOUT=${BUNDLE_WITHOUT:-"test"} + elif [[ "$RAILS_ENV" == "test" || "$RACK_ENV" == "test" ]]; then + BUNDLE_WITHOUT=${BUNDLE_WITHOUT:-"development"} + else + BUNDLE_WITHOUT=${BUNDLE_WITHOUT:-"development:test"} + fi + + if [ -n "$BUNDLE_WITHOUT" ]; then + bundle config set --local without "$BUNDLE_WITHOUT" + fi + + echo "---> Running 'bundle install ${ADDTL_BUNDLE_ARGS}' ..." + bundle config set --local path "./bundle" + bundle install ${ADDTL_BUNDLE_ARGS} + + echo "---> Cleaning up unused ruby gems ..." + bundle clean --verbose +fi + +if ! bundle exec rackup -h &>/dev/null; then + echo "WARNING: Rubygem Rack is not installed in the present image." + echo " Add rack to your Gemfile in order to start the web server." +fi + +if [[ "$RAILS_ENV" == "production" || "$RACK_ENV" == "production" ]]; then + rake_assets_precompile +fi + +# Fix source directory permissions +fix-permissions ./ diff --git a/3.3/s2i/bin/run b/3.3/s2i/bin/run new file mode 100755 index 00000000..1614ec3b --- /dev/null +++ b/3.3/s2i/bin/run @@ -0,0 +1,39 @@ +#!/bin/bash + +function is_puma_installed() { + [ ! -f Gemfile.lock ] && return 1 + grep ' puma ' Gemfile.lock >/dev/null +} + +set -e + +function check_number() { + if [[ ! "$2" =~ ^[0-9]+$ ]]; then + echo "$1 needs to be a non-negative number" + exit 1 + fi +} +check_number PUMA_WORKERS "${PUMA_WORKERS:-0}" +check_number PUMA_MIN_THREADS "${PUMA_MIN_THREADS:-0}" +check_number PUMA_MAX_THREADS "${PUMA_MAX_THREADS:-0}" + +export RACK_ENV=${RACK_ENV:-"production"} + +if is_puma_installed; then + export_vars=$(cgroup-limits) ; export $export_vars + + exec bundle exec "puma --config ../etc/puma.cfg" +else + echo "You might consider adding 'puma' into your Gemfile." + + if bundle exec rackup -h &>/dev/null; then + if [ -f Gemfile ]; then + exec bundle exec "rackup -E ${RAILS_ENV:-$RACK_ENV} -P /tmp/rack.pid --host 0.0.0.0 --port 8080" + else + exec rackup -E "${RAILS_ENV:-$RACK_ENV}" -P /tmp/rack.pid --host 0.0.0.0 --port 8080 + fi + else + echo "ERROR: Rubygem Rack is not installed in the present image." + echo " Add rack to your Gemfile in order to start the web server." + fi +fi diff --git a/3.3/s2i/bin/usage b/3.3/s2i/bin/usage new file mode 100755 index 00000000..76b9beb1 --- /dev/null +++ b/3.3/s2i/bin/usage @@ -0,0 +1,18 @@ +#!/bin/sh + +DISTRO="`grep ^ID= /etc/*-release | cut -d'"' -f2`" + +cat < -- curl 127.0.0.1:8080 + +Alternatively, to run the image directly using podman or docker, or how to use it as a parent image in a Dockerfile, see documentation at + +https://github.com/sclorg/s2i-ruby-container/blob/master/${RUBY_VERSION}/README.md +EOF diff --git a/3.3/test/__init__.py b/3.3/test/__init__.py new file mode 120000 index 00000000..d0f4746a --- /dev/null +++ b/3.3/test/__init__.py @@ -0,0 +1 @@ +../../test/__init__.py \ No newline at end of file diff --git a/3.3/test/conftest.py b/3.3/test/conftest.py new file mode 120000 index 00000000..3f2d7840 --- /dev/null +++ b/3.3/test/conftest.py @@ -0,0 +1 @@ +../../test/conftest.py \ No newline at end of file diff --git a/3.3/test/examples b/3.3/test/examples new file mode 120000 index 00000000..d15735c1 --- /dev/null +++ b/3.3/test/examples @@ -0,0 +1 @@ +../../examples \ No newline at end of file diff --git a/3.3/test/imagestreams b/3.3/test/imagestreams new file mode 120000 index 00000000..7a0aee9c --- /dev/null +++ b/3.3/test/imagestreams @@ -0,0 +1 @@ +../../imagestreams \ No newline at end of file diff --git a/3.3/test/puma-test-app/Gemfile b/3.3/test/puma-test-app/Gemfile new file mode 100755 index 00000000..a98e5e1c --- /dev/null +++ b/3.3/test/puma-test-app/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' + +gem 'sinatra' +gem 'puma' diff --git a/3.3/test/puma-test-app/Gemfile.lock b/3.3/test/puma-test-app/Gemfile.lock new file mode 100644 index 00000000..1d327833 --- /dev/null +++ b/3.3/test/puma-test-app/Gemfile.lock @@ -0,0 +1,25 @@ +GEM + remote: https://rubygems.org/ + specs: + mustermann (1.1.1) + ruby2_keywords (~> 0.0.1) + nio4r (2.7.3) + puma (5.2.2) + nio4r (~> 2.0) + rack (2.2.3) + rack-protection (2.1.0) + rack + ruby2_keywords (0.0.4) + sinatra (2.1.0) + mustermann (~> 1.0) + rack (~> 2.2) + rack-protection (= 2.1.0) + tilt (~> 2.0) + tilt (2.0.10) + +PLATFORMS + ruby + +DEPENDENCIES + puma + sinatra diff --git a/3.3/test/puma-test-app/app.rb b/3.3/test/puma-test-app/app.rb new file mode 100755 index 00000000..cd7e87d7 --- /dev/null +++ b/3.3/test/puma-test-app/app.rb @@ -0,0 +1,5 @@ +require 'sinatra' + +get '/' do + 'Hello world!' +end diff --git a/3.3/test/puma-test-app/config.ru b/3.3/test/puma-test-app/config.ru new file mode 100755 index 00000000..76a6edff --- /dev/null +++ b/3.3/test/puma-test-app/config.ru @@ -0,0 +1,2 @@ +require './app' +run Sinatra::Application diff --git a/3.3/test/rack-test-app/Gemfile b/3.3/test/rack-test-app/Gemfile new file mode 100755 index 00000000..d89e792e --- /dev/null +++ b/3.3/test/rack-test-app/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' + +gem 'sinatra' +gem 'webrick' diff --git a/3.3/test/rack-test-app/Gemfile.lock b/3.3/test/rack-test-app/Gemfile.lock new file mode 100644 index 00000000..883bfb2b --- /dev/null +++ b/3.3/test/rack-test-app/Gemfile.lock @@ -0,0 +1,23 @@ +GEM + remote: https://rubygems.org/ + specs: + mustermann (1.1.1) + ruby2_keywords (~> 0.0.1) + rack (2.2.3) + rack-protection (2.1.0) + rack + ruby2_keywords (0.0.4) + sinatra (2.1.0) + mustermann (~> 1.0) + rack (~> 2.2) + rack-protection (= 2.1.0) + tilt (~> 2.0) + tilt (2.0.10) + webrick (1.7.0) + +PLATFORMS + ruby + +DEPENDENCIES + sinatra + webrick diff --git a/3.3/test/rack-test-app/app.rb b/3.3/test/rack-test-app/app.rb new file mode 100755 index 00000000..cd7e87d7 --- /dev/null +++ b/3.3/test/rack-test-app/app.rb @@ -0,0 +1,5 @@ +require 'sinatra' + +get '/' do + 'Hello world!' +end diff --git a/3.3/test/rack-test-app/config.ru b/3.3/test/rack-test-app/config.ru new file mode 100755 index 00000000..76a6edff --- /dev/null +++ b/3.3/test/rack-test-app/config.ru @@ -0,0 +1,2 @@ +require './app' +run Sinatra::Application diff --git a/3.3/test/run b/3.3/test/run new file mode 120000 index 00000000..44977d63 --- /dev/null +++ b/3.3/test/run @@ -0,0 +1 @@ +../../test/run \ No newline at end of file diff --git a/3.3/test/run-openshift-pytest b/3.3/test/run-openshift-pytest new file mode 120000 index 00000000..5063ae30 --- /dev/null +++ b/3.3/test/run-openshift-pytest @@ -0,0 +1 @@ +../../test/run-openshift-pytest \ No newline at end of file diff --git a/3.3/test/run-pytest b/3.3/test/run-pytest new file mode 120000 index 00000000..efe32b48 --- /dev/null +++ b/3.3/test/run-pytest @@ -0,0 +1 @@ +../../test/run-pytest \ No newline at end of file diff --git a/3.3/test/test-fips/Gemfile b/3.3/test/test-fips/Gemfile new file mode 100644 index 00000000..21fff265 --- /dev/null +++ b/3.3/test/test-fips/Gemfile @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +source 'https://rubygems.org' + +gem 'sinatra' + +gem 'rackup' + +# Use webrick for simple HTTP transport. +# this is not a production grade server, but gets the job done for the +# purpose of just sending something over for a request. +# Additionally there is an option to add SSL later here. +gem 'webrick' diff --git a/3.3/test/test-fips/app.rb b/3.3/test/test-fips/app.rb new file mode 100644 index 00000000..8c5a9eb0 --- /dev/null +++ b/3.3/test/test-fips/app.rb @@ -0,0 +1,72 @@ +require 'sinatra' +require 'openssl' + +set :server, 'webrick' +set :bind, '0.0.0.0' +set :port, 8080 + +MESSAGE = "My secret text\n".freeze + +get '/symmetric/aes-256-cbc' do + fips_state = OpenSSL.fips_mode ? 'enabled' : 'disabled' + # This should pass with and without FIPS. + cipher = OpenSSL::Cipher.new('aes-256-cfb') + cipher.encrypt + cipher.random_key + cipher.random_iv + enc = cipher.update(MESSAGE) + cipher.final + return 200, enc +rescue => e + return 409, "Unexpected failure with aes-256-cbc, fips #{fips_state}, #{e.inspect}\nBacktrace:\n#{e.backtrace}\n" +end + +get '/symmetric/des-ede-cbc' do + status = 200 + fips_state = OpenSSL.fips_mode ? 'enabled' : 'disabled' + + cipher = OpenSSL::Cipher.new('des-ede-cbc') + cipher.encrypt + # This fails in FIPS only once we try to get a key for the 3DES. + cipher.random_key + cipher.random_iv + cipher.update(MESSAGE) + cipher.final +rescue OpenSSL::Cipher::CipherError => e + return status, "Failed with fips #{fips_state} #{e.inspect}\n" if OpenSSL.fips_mode + + return 500, "Failed with fips #{fips_state} #{e.inspect}\nBacktrace:\n#{e.backtrace}\n" +rescue => e + return 409, "Unexpected failure with des-ede-cbc, fips #{fips_state}, #{e.inspect}\nBacktrace:\n#{e.backtrace}\n" +end + +get '/hash/sha256' do + status = 200 + + fips_state = OpenSSL.fips_mode ? 'enabled' : 'disabled' + message = "SHA256 succeeded, fips is #{fips_state}" + + OpenSSL::Digest.digest('SHA256', MESSAGE) + + return status, message +rescue => e + return 409, "Unexpected failure with SHA256, fips #{fips_state}, #{e.inspect}\nBacktrace:\n#{e.backtrace}\n" +end + +get '/hash/md5' do + status = 200 + + fips_state = OpenSSL.fips_mode ? 'enabled' : 'disabled' + message = "MD5 succeeded, fips is #{fips_state}" + + OpenSSL::Digest.digest('MD5', MESSAGE) + + # FIPS is on, but this passed, that shouldn't be the case. + status = 500 if OpenSSL.fips_mode + + return status, message +rescue OpenSSL::Digest::DigestError => e + return status, "Failed with fips #{fips_state} #{e.inspect}\n" if OpenSSL.fips_mode + + return 500, "Failed with fips #{fips_state} #{e.inspect}\nBacktrace:\n#{e.backtrace}\n" +rescue => e + return 409, "Unexpected failure with MD5, fips #{fips_state}, #{e.inspect}\nBacktrace:\n#{e.backtrace}\n" +end diff --git a/3.3/test/test-fips/config.ru b/3.3/test/test-fips/config.ru new file mode 100644 index 00000000..76a6edff --- /dev/null +++ b/3.3/test/test-fips/config.ru @@ -0,0 +1,2 @@ +require './app' +run Sinatra::Application diff --git a/3.3/test/test-lib-openshift.sh b/3.3/test/test-lib-openshift.sh new file mode 120000 index 00000000..4f9f2996 --- /dev/null +++ b/3.3/test/test-lib-openshift.sh @@ -0,0 +1 @@ +../../common/test-lib-openshift.sh \ No newline at end of file diff --git a/3.3/test/test-lib-remote-openshift.sh b/3.3/test/test-lib-remote-openshift.sh new file mode 120000 index 00000000..92ad2f4d --- /dev/null +++ b/3.3/test/test-lib-remote-openshift.sh @@ -0,0 +1 @@ +../../common/test-lib-remote-openshift.sh \ No newline at end of file diff --git a/3.3/test/test-lib.sh b/3.3/test/test-lib.sh new file mode 120000 index 00000000..1ac99b93 --- /dev/null +++ b/3.3/test/test-lib.sh @@ -0,0 +1 @@ +../../common/test-lib.sh \ No newline at end of file diff --git a/3.3/test/test-openshift.yaml b/3.3/test/test-openshift.yaml new file mode 120000 index 00000000..8613fbba --- /dev/null +++ b/3.3/test/test-openshift.yaml @@ -0,0 +1 @@ +../../common/test-openshift.yaml \ No newline at end of file diff --git a/3.3/test/test_container_application.py b/3.3/test/test_container_application.py new file mode 120000 index 00000000..25c1c1ec --- /dev/null +++ b/3.3/test/test_container_application.py @@ -0,0 +1 @@ +../../test/test_container_application.py \ No newline at end of file diff --git a/3.3/test/test_container_basics.py b/3.3/test/test_container_basics.py new file mode 120000 index 00000000..b85dc139 --- /dev/null +++ b/3.3/test/test_container_basics.py @@ -0,0 +1 @@ +../../test/test_container_basics.py \ No newline at end of file diff --git a/3.3/test/test_container_fips.py b/3.3/test/test_container_fips.py new file mode 120000 index 00000000..b06669f3 --- /dev/null +++ b/3.3/test/test_container_fips.py @@ -0,0 +1 @@ +../../test/test_container_fips.py \ No newline at end of file diff --git a/3.3/test/test_ocp_helm_ruby_imagestreams.py b/3.3/test/test_ocp_helm_ruby_imagestreams.py new file mode 120000 index 00000000..998c113c --- /dev/null +++ b/3.3/test/test_ocp_helm_ruby_imagestreams.py @@ -0,0 +1 @@ +../../test/test_ocp_helm_ruby_imagestreams.py \ No newline at end of file diff --git a/3.3/test/test_ocp_helm_ruby_rails_application.py b/3.3/test/test_ocp_helm_ruby_rails_application.py new file mode 120000 index 00000000..aa7e5df2 --- /dev/null +++ b/3.3/test/test_ocp_helm_ruby_rails_application.py @@ -0,0 +1 @@ +../../test/test_ocp_helm_ruby_rails_application.py \ No newline at end of file diff --git a/3.3/test/test_ocp_ruby_ex_standalone.py b/3.3/test/test_ocp_ruby_ex_standalone.py new file mode 120000 index 00000000..42ee4afc --- /dev/null +++ b/3.3/test/test_ocp_ruby_ex_standalone.py @@ -0,0 +1 @@ +../../test/test_ocp_ruby_ex_standalone.py \ No newline at end of file diff --git a/3.3/test/test_ocp_ruby_latest_imagestreams.py b/3.3/test/test_ocp_ruby_latest_imagestreams.py new file mode 120000 index 00000000..247808c0 --- /dev/null +++ b/3.3/test/test_ocp_ruby_latest_imagestreams.py @@ -0,0 +1 @@ +../../test/test_ocp_ruby_latest_imagestreams.py \ No newline at end of file diff --git a/3.3/test/test_ocp_s2i_imagestreams.py b/3.3/test/test_ocp_s2i_imagestreams.py new file mode 120000 index 00000000..3c4b5d99 --- /dev/null +++ b/3.3/test/test_ocp_s2i_imagestreams.py @@ -0,0 +1 @@ +../../test/test_ocp_s2i_imagestreams.py \ No newline at end of file diff --git a/3.3/test/test_ocp_s2i_integration.py b/3.3/test/test_ocp_s2i_integration.py new file mode 120000 index 00000000..01bb85c5 --- /dev/null +++ b/3.3/test/test_ocp_s2i_integration.py @@ -0,0 +1 @@ +../../test/test_ocp_s2i_integration.py \ No newline at end of file diff --git a/3.3/test/test_ocp_s2i_templates.py b/3.3/test/test_ocp_s2i_templates.py new file mode 120000 index 00000000..5932fc15 --- /dev/null +++ b/3.3/test/test_ocp_s2i_templates.py @@ -0,0 +1 @@ +../../test/test_ocp_s2i_templates.py \ No newline at end of file From 4153c6d835f5b581c9035c530f35a77a403fe43b Mon Sep 17 00:00:00 2001 From: Jarek Prokop Date: Mon, 12 Jan 2026 12:22:24 +0100 Subject: [PATCH 3/7] Remove RHEL 8 containerfile. --- 4.0/Dockerfile.rhel8 | 65 -------------------------------------------- 1 file changed, 65 deletions(-) delete mode 100644 4.0/Dockerfile.rhel8 diff --git a/4.0/Dockerfile.rhel8 b/4.0/Dockerfile.rhel8 deleted file mode 100644 index 930bf782..00000000 --- a/4.0/Dockerfile.rhel8 +++ /dev/null @@ -1,65 +0,0 @@ -FROM ubi8/s2i-base - -# This image provides a Ruby environment you can use to run your Ruby -# applications. - -EXPOSE 8080 - -ENV RUBY_MAJOR_VERSION=3 \ - RUBY_MINOR_VERSION=3 - -ENV RUBY_VERSION="${RUBY_MAJOR_VERSION}.${RUBY_MINOR_VERSION}" \ - RUBY_SCL_NAME_VERSION="${RUBY_MAJOR_VERSION}${RUBY_MINOR_VERSION}" - -ENV RUBY_SCL="ruby-${RUBY_SCL_NAME_VERSION}" \ - IMAGE_NAME="ubi8/ruby-${RUBY_SCL_NAME_VERSION}" \ - SUMMARY="Platform for building and running Ruby $RUBY_VERSION applications" \ - DESCRIPTION="Ruby $RUBY_VERSION available as container is a base platform for \ -building and running various Ruby $RUBY_VERSION applications and frameworks. \ -Ruby is the interpreted scripting language for quick and easy object-oriented programming. \ -It has many features to process text files and to do system management tasks (as in Perl). \ -It is simple, straight-forward, and extensible." - -LABEL summary="$SUMMARY" \ - description="$DESCRIPTION" \ - io.k8s.description="$DESCRIPTION" \ - io.k8s.display-name="Ruby ${RUBY_VERSION}" \ - io.openshift.expose-services="8080:http" \ - io.openshift.tags="builder,ruby,ruby${RUBY_SCL_NAME_VERSION},${RUBY_SCL}" \ - com.redhat.component="${RUBY_SCL}-container" \ - name="${IMAGE_NAME}" \ - version="1" \ - com.redhat.license_terms="https://www.redhat.com/en/about/red-hat-end-user-license-agreements#UBI" \ - usage="s2i build https://github.com/sclorg/s2i-ruby-container.git \ ---context-dir=${RUBY_VERSION}/test/puma-test-app/ ${IMAGE_NAME} ruby-sample-app" \ - maintainer="SoftwareCollections.org " - -RUN yum -y module enable ruby:$RUBY_VERSION && \ - INSTALL_PKGS=" \ - libffi-devel \ - ruby \ - ruby-devel \ - rubygem-rake \ - rubygem-bundler \ - ruby-bundled-gems \ - redhat-rpm-config \ - " && \ - yum install -y --setopt=tsflags=nodocs ${INSTALL_PKGS} && \ - yum -y clean all --enablerepo='*' && \ - ruby -v | grep -qe "^ruby $RUBY_VERSION\." && echo "Found VERSION $RUBY_VERSION" && \ - rpm -V ${INSTALL_PKGS} - -# Copy the S2I scripts from the specific language image to $STI_SCRIPTS_PATH -COPY ./s2i/bin/ $STI_SCRIPTS_PATH - -# Copy extra files to the image. -COPY ./root/ / - -# Drop the root user and make the content of /opt/app-root owned by user 1001 -RUN chown -R 1001:0 ${APP_ROOT} && chmod -R ug+rwx ${APP_ROOT} && \ - rpm-file-permissions - -USER 1001 - -# Set the default CMD to print the usage of the language image -CMD $STI_SCRIPTS_PATH/usage From 0f4f44c1ef425a6f5598dfc5c92c8d31f0156629 Mon Sep 17 00:00:00 2001 From: Jarek Prokop Date: Mon, 12 Jan 2026 12:27:15 +0100 Subject: [PATCH 4/7] Update 3.3 references to 4.0. --- 4.0/Dockerfile.c10s | 13 +++++-------- 4.0/Dockerfile.c9s | 4 ++-- 4.0/Dockerfile.fedora | 6 +++--- 4.0/Dockerfile.rhel10 | 13 +++++-------- 4.0/Dockerfile.rhel9 | 4 ++-- 4.0/README.md | 32 ++++++++++++++++---------------- Makefile | 2 +- README.md | 1 + 8 files changed, 35 insertions(+), 40 deletions(-) diff --git a/4.0/Dockerfile.c10s b/4.0/Dockerfile.c10s index edd3c2d6..541a8694 100644 --- a/4.0/Dockerfile.c10s +++ b/4.0/Dockerfile.c10s @@ -5,8 +5,8 @@ FROM quay.io/sclorg/s2i-base-c10s:c10s EXPOSE 8080 -ENV RUBY_MAJOR_VERSION=3 \ - RUBY_MINOR_VERSION=3 +ENV RUBY_MAJOR_VERSION=4 \ + RUBY_MINOR_VERSION=0 ENV RUBY_VERSION="${RUBY_MAJOR_VERSION}.${RUBY_MINOR_VERSION}" \ RUBY_SCL_NAME_VERSION="${RUBY_MAJOR_VERSION}${RUBY_MINOR_VERSION}" @@ -36,17 +36,14 @@ LABEL summary="$SUMMARY" \ RUN INSTALL_PKGS=" \ libffi-devel \ - ruby \ - ruby-devel \ - rubygem-rake \ - rubygem-bundler \ - ruby-bundled-gems \ + ruby4.0 \ + ruby4.0-devel \ redhat-rpm-config \ " && \ dnf install -y --setopt=tsflags=nodocs ${INSTALL_PKGS} && \ dnf reinstall -y --setopt=tsflags=nodocs tzdata && \ dnf -y clean all --enablerepo='*' && \ - ruby -v | grep -qe "^ruby $RUBY_VERSION\." && echo "Found VERSION $RUBY_VERSION" && \ + ruby4.0 -v | grep -qe "^ruby $RUBY_VERSION\." && echo "Found VERSION $RUBY_VERSION" && \ rpm -V ${INSTALL_PKGS} # Copy the S2I scripts from the specific language image to $STI_SCRIPTS_PATH diff --git a/4.0/Dockerfile.c9s b/4.0/Dockerfile.c9s index d12412bb..27b88030 100644 --- a/4.0/Dockerfile.c9s +++ b/4.0/Dockerfile.c9s @@ -5,8 +5,8 @@ FROM quay.io/sclorg/s2i-base-c9s:c9s EXPOSE 8080 -ENV RUBY_MAJOR_VERSION=3 \ - RUBY_MINOR_VERSION=3 +ENV RUBY_MAJOR_VERSION=4 \ + RUBY_MINOR_VERSION=0 ENV RUBY_VERSION="${RUBY_MAJOR_VERSION}.${RUBY_MINOR_VERSION}" \ RUBY_SCL_NAME_VERSION="${RUBY_MAJOR_VERSION}${RUBY_MINOR_VERSION}" diff --git a/4.0/Dockerfile.fedora b/4.0/Dockerfile.fedora index bd2d64fd..0a71c815 100644 --- a/4.0/Dockerfile.fedora +++ b/4.0/Dockerfile.fedora @@ -1,4 +1,4 @@ -FROM quay.io/fedora/s2i-base:40 +FROM quay.io/fedora/s2i-base:44 # This image provides a Ruby environment you can use to run your Ruby # applications. @@ -6,8 +6,8 @@ FROM quay.io/fedora/s2i-base:40 EXPOSE 8080 ENV NAME=ruby \ - RUBY_VERSION=3.3 \ - RUBY_SHORT_VER=33 \ + RUBY_VERSION=4.0 \ + RUBY_SHORT_VER=40 \ VERSION= ENV SUMMARY="Platform for building and running Ruby $RUBY_VERSION applications" \ diff --git a/4.0/Dockerfile.rhel10 b/4.0/Dockerfile.rhel10 index ef0edbd7..5d5e24c4 100644 --- a/4.0/Dockerfile.rhel10 +++ b/4.0/Dockerfile.rhel10 @@ -5,8 +5,8 @@ FROM ubi10/s2i-base EXPOSE 8080 -ENV RUBY_MAJOR_VERSION=3 \ - RUBY_MINOR_VERSION=3 +ENV RUBY_MAJOR_VERSION=4 \ + RUBY_MINOR_VERSION=0 ENV RUBY_VERSION="${RUBY_MAJOR_VERSION}.${RUBY_MINOR_VERSION}" \ RUBY_SCL_NAME_VERSION="${RUBY_MAJOR_VERSION}${RUBY_MINOR_VERSION}" @@ -35,17 +35,14 @@ LABEL summary="$SUMMARY" \ RUN INSTALL_PKGS=" \ libffi-devel \ - ruby \ - ruby-devel \ - rubygem-rake \ - rubygem-bundler \ - ruby-bundled-gems \ + ruby4.0 \ + ruby4.0-devel \ redhat-rpm-config \ " && \ dnf install -y --setopt=tsflags=nodocs ${INSTALL_PKGS} && \ dnf reinstall -y --setopt=tsflags=nodocs tzdata && \ dnf -y clean all --enablerepo='*' && \ - ruby -v | grep -qe "^ruby $RUBY_VERSION\." && echo "Found VERSION $RUBY_VERSION" && \ + ruby4.0 -v | grep -qe "^ruby $RUBY_VERSION\." && echo "Found VERSION $RUBY_VERSION" && \ rpm -V ${INSTALL_PKGS} # Copy the S2I scripts from the specific language image to $STI_SCRIPTS_PATH diff --git a/4.0/Dockerfile.rhel9 b/4.0/Dockerfile.rhel9 index 61bc8907..dc4b2d5b 100644 --- a/4.0/Dockerfile.rhel9 +++ b/4.0/Dockerfile.rhel9 @@ -5,8 +5,8 @@ FROM ubi9/s2i-base EXPOSE 8080 -ENV RUBY_MAJOR_VERSION=3 \ - RUBY_MINOR_VERSION=3 +ENV RUBY_MAJOR_VERSION=4 \ + RUBY_MINOR_VERSION=0 ENV RUBY_VERSION="${RUBY_MAJOR_VERSION}.${RUBY_MINOR_VERSION}" \ RUBY_SCL_NAME_VERSION="${RUBY_MAJOR_VERSION}${RUBY_MINOR_VERSION}" diff --git a/4.0/README.md b/4.0/README.md index 73d26dda..6efc90eb 100644 --- a/4.0/README.md +++ b/4.0/README.md @@ -1,6 +1,6 @@ -Ruby 3.3 container image +Ruby 4.0 container image ======================== -This container image includes Ruby 3.3 as a [S2I](https://github.com/openshift/source-to-image) base image for your Ruby 3.3 applications. +This container image includes Ruby 4.0 as a [S2I](https://github.com/openshift/source-to-image) base image for your Ruby 4.0 applications. Users can choose between RHEL, CentOS Stream and Fedora based builder images. The RHEL images are available in the [Red Hat Container Catalog](https://access.redhat.com/containers/), the CentOS Stream images are available on [Quay.io](https://quay.io/organization/sclorg), @@ -12,8 +12,8 @@ Note: while the examples in this README are calling `podman`, you can replace an Description ----------- -Ruby 3.3 available as container is a base platform for -building and running various Ruby 3.3 applications and frameworks. +Ruby 4.0 available as container is a base platform for +building and running various Ruby 4.0 applications and frameworks. Ruby is the interpreted scripting language for quick and easy object-oriented programming. It has many features to process text files and to do system management tasks (as in Perl). It is simple, straight-forward, and extensible. @@ -25,12 +25,12 @@ the nodejs itself is included just to make the npm work. Usage in Openshift ------------------ -For this, we will assume that you are using the `ubi10/ruby-33 image`, available via `ruby:3.3` imagestream tag in Openshift. -Building a simple [ruby-sample-app](https://github.com/sclorg/s2i-ruby-container/tree/master/3.3/test/puma-test-app) application +For this, we will assume that you are using the `ubi10/ruby-40` image, available via `ruby:4.0` imagestream tag in Openshift. +Building a simple [ruby-sample-app](https://github.com/sclorg/s2i-ruby-container/tree/master/4.0/test/puma-test-app) application in Openshift can be achieved with the following step: ``` - oc new-app ruby:3.3~https://github.com/sclorg/rails-ex.git + oc new-app ruby:4.0~https://github.com/sclorg/rails-ex.git ``` **Accessing the application:** @@ -64,10 +64,10 @@ To use the Ruby image in a Dockerfile, follow these steps: #### 1. Pull a base builder image to build on ``` -podman pull ubi10/ruby-33 +podman pull ubi10/ruby-40 ``` -An RHEL10 image `ubi10/ruby-33` is used in this example. +An RHEL10 image `ubi10/ruby-40` is used in this example. #### 2. Pull and application code @@ -85,11 +85,11 @@ This step usually consists of at least these parts: * installing the dependencies * setting the default command in the resulting image -For all these three parts, users can use the Source-to-Image scripts inside the image ([3.3.](#33-to-use-the-source-to-image-scripts-and-build-an-image-using-a-dockerfile-create-a-dockerfile-with-this-content)), or users can either setup all manually and use commands `ruby`, `bundle` and `rackup` explicitly in the Dockerfile ([3.3.](#33-to-use-your-own-setup-create-a-dockerfile-with-this-content)) +For all these three parts, users can use the Source-to-Image scripts inside the image ([4.0.](#33-to-use-the-source-to-image-scripts-and-build-an-image-using-a-dockerfile-create-a-dockerfile-with-this-content)), or users can either setup all manually and use commands `ruby`, `bundle` and `rackup` explicitly in the Dockerfile ([4.0.](#33-to-use-your-own-setup-create-a-dockerfile-with-this-content)) -##### 3.3 To use the Source-to-Image scripts and build an image using a Dockerfile, create a Dockerfile with this content: +##### 4.0 To use the Source-to-Image scripts and build an image using a Dockerfile, create a Dockerfile with this content: ``` -FROM ubi10/ruby-33 +FROM ubi10/ruby-40 # Add application sources to a directory that the assemble scriptexpects them # and set permissions so that the container runs without root access @@ -108,9 +108,9 @@ RUN /usr/libexec/s2i/assemble CMD /usr/libexec/s2i/run ``` The s2i scripts are used to set-up and run common Ruby applications. More information about the scripts can be found in [Source-to-Image](#source-to-image-framework-and-scripts) section. -##### 3.3 To use your own setup, create a Dockerfile with this content: +##### 4.0 To use your own setup, create a Dockerfile with this content: ``` -FROM ubi10/ruby-33 +FROM ubi10/ruby-40 USER 0 ADD app-src ./ @@ -225,5 +225,5 @@ See also -------- Dockerfile and other sources are available on https://github.com/sclorg/s2i-ruby-container. In that repository you also can find another versions of Ruby environment Dockerfiles. -The Dockerfile for RHEL8 is called `Dockerfile.rhel8`, for RHEL9 it's `Dockerfile.rhel9`, -for RHEL10 it's `Dockerfile.rhel10`, for CentOS Stream 10 it's `Dockerfile.c10s` and the Fedora Dockerfile is called Dockerfile.fedora. +The Dockerfile for RHEL9 is called `Dockerfile.rhel9`, for RHEL10 it's `Dockerfile.rhel10`, +for CentOS Stream 10 it's `Dockerfile.c10s` and the Fedora Dockerfile is called `Dockerfile.fedora`. diff --git a/Makefile b/Makefile index 49e6f17c..2bff14b5 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ # Variables are documented in common/build.sh. BASE_IMAGE_NAME = ruby -VERSIONS = 2.5 3.0 3.3 +VERSIONS = 2.5 3.0 3.3 4.0 OPENSHIFT_NAMESPACES = 2.0 CONU_IMAGE := docker.io/usercont/conu:0.6.2 diff --git a/README.md b/README.md index e6ee98be..1b8b76e6 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ Table start |2.5||||
`registry.redhat.io/rhel8/ruby-25`
||| |3.0|||||
`registry.redhat.io/rhel9/ruby-30`
|| |3.3||
`quay.io/sclorg/ruby-33-c10s`
|
`quay.io/fedora/ruby-33`
|
`registry.redhat.io/rhel8/ruby-33`
|
`registry.redhat.io/rhel9/ruby-33`
|
`registry.redhat.io/rhel10/ruby-33`
| +|4.0||
`quay.io/sclorg/ruby-40-c10s`
|
`quay.io/fedora/ruby-40`
||
`registry.redhat.io/rhel9/ruby-40`
|
`registry.redhat.io/rhel10/ruby-40`
| From f90d9020443bd51df3756e6608076232a8cb8096 Mon Sep 17 00:00:00 2001 From: Jarek Prokop Date: Mon, 12 Jan 2026 12:31:03 +0100 Subject: [PATCH 5/7] Symlink the versioned binary to unversioned default. The binaries in demodularized rubies were suffixed with the MAJOR.MINOR versioning. In these containers, provide the unversioned commands via a symlink. --- 4.0/Dockerfile.c10s | 7 +++++++ 4.0/Dockerfile.rhel10 | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/4.0/Dockerfile.c10s b/4.0/Dockerfile.c10s index 541a8694..a3e7d0dc 100644 --- a/4.0/Dockerfile.c10s +++ b/4.0/Dockerfile.c10s @@ -46,6 +46,13 @@ RUN INSTALL_PKGS=" \ ruby4.0 -v | grep -qe "^ruby $RUBY_VERSION\." && echo "Found VERSION $RUBY_VERSION" && \ rpm -V ${INSTALL_PKGS} +# Symlink the binaries. Ruby now provides suffixed binaries in /usr/bin. +# Provide the non-suffixed version in the container. +RUN rpm -ql ruby4.0 ruby4.0-devel | \ + grep '/usr/bin' | \ + xargs --max-args=1 basename -s ${RUBY_VERSION} | \ + xargs -I{} ln -s "/usr/bin/{}${RUBY_VERSION}" "/usr/bin/{}" + # Copy the S2I scripts from the specific language image to $STI_SCRIPTS_PATH COPY ./s2i/bin/ $STI_SCRIPTS_PATH diff --git a/4.0/Dockerfile.rhel10 b/4.0/Dockerfile.rhel10 index 5d5e24c4..f2ca3a99 100644 --- a/4.0/Dockerfile.rhel10 +++ b/4.0/Dockerfile.rhel10 @@ -45,6 +45,13 @@ RUN INSTALL_PKGS=" \ ruby4.0 -v | grep -qe "^ruby $RUBY_VERSION\." && echo "Found VERSION $RUBY_VERSION" && \ rpm -V ${INSTALL_PKGS} +# Symlink the binaries. Ruby now provides suffixed binaries in /usr/bin. +# Provide the non-suffixed version in the container. +RUN rpm -ql ruby4.0 ruby4.0-devel | \ + grep '/usr/bin' | \ + xargs --max-args=1 basename -s ${RUBY_VERSION} | \ + xargs -I{} ln -s "/usr/bin/{}${RUBY_VERSION}" "/usr/bin/{}" + # Copy the S2I scripts from the specific language image to $STI_SCRIPTS_PATH COPY ./s2i/bin/ $STI_SCRIPTS_PATH From 628a60929f1203efe8b7779513e3ce494031d41a Mon Sep 17 00:00:00 2001 From: Jarek Prokop Date: Thu, 5 Mar 2026 14:51:49 +0100 Subject: [PATCH 6/7] 4.0: Set bundle path via config before installing. With Bundler >= 4.0, the CLI no longer accepts config options as part of CLI. Set the path to a custom directory in a local directory with `bundle config set --local path ` where applicable. --- 4.0/README.md | 3 ++- examples/from-dockerfile/Dockerfile | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/4.0/README.md b/4.0/README.md index 6efc90eb..f8976d09 100644 --- a/4.0/README.md +++ b/4.0/README.md @@ -114,7 +114,8 @@ FROM ubi10/ruby-40 USER 0 ADD app-src ./ -RUN bundle install --path ./bundle +RUN bundle config set --local path ./bundle && \ + bundle install CMD bundle exec "rackup -P /tmp/rack.pid --host 0.0.0.0 --port 8080" ``` diff --git a/examples/from-dockerfile/Dockerfile b/examples/from-dockerfile/Dockerfile index f6e39450..7d9e67d9 100644 --- a/examples/from-dockerfile/Dockerfile +++ b/examples/from-dockerfile/Dockerfile @@ -2,6 +2,7 @@ FROM ubi8/ruby-33 ADD --chown=default:root app-src ./ -RUN bundle install --path ./bundle +RUN bundle config set --local path ./bundle && \ + bundle install CMD exec bundle exec "rackup -P /tmp/rack.pid --host 0.0.0.0 --port 8080" From 5940533b8a395eaea5592ec14162fe3a0a865c7e Mon Sep 17 00:00:00 2001 From: Jarek Prokop Date: Tue, 10 Mar 2026 15:04:03 +0100 Subject: [PATCH 7/7] Replace 2.5 test's examples symlink with version-specific test files. Delete the 2.5/test/examples symlink and add Ruby 2.5 specific files where necessary. This change is necessary as there is increased difficulty in code sharing between 4.0 and 2.5. Here the change was prompted by bundler's CLI incompatibilities. Bundler 4 removed ability to specify configuration options, such as `--path` with some commands such as `install`. Options have to be set throught `bundle config` CLI. However between bundler 1.16 in Ruby 2.5 and Bundler 4 in Ruby 4.0 there are differences in the CLI API, where it is not possible to share the same set of commands easily and achieve the same effect. Attempt to set the path via `bundle config set` in Ruby 2.5 container will produce bogus value in `./.bundle/config` that can result in undesired install behavior. And in Bundler 4, using `bundle config` without `set` `get`, ... is deprecated. Instead of trying to keep the compatibility between versions at all cost, the offending Dockerfile was replaced by actual file, the rest of the directory was symlinked per-item to retain code sharing where reasonable. --- 2.5/test/examples | 1 - 2.5/test/examples/from-dockerfile/Dockerfile | 7 +++++++ 2.5/test/examples/from-dockerfile/Dockerfile.s2i | 1 + 2.5/test/examples/from-dockerfile/README.md | 1 + 2.5/test/examples/rails-postgresql-persistent.json | 1 + 2.5/test/examples/rails-postgresql.json | 1 + 2.5/test/examples/rails.json | 1 + 7 files changed, 12 insertions(+), 1 deletion(-) delete mode 120000 2.5/test/examples create mode 100644 2.5/test/examples/from-dockerfile/Dockerfile create mode 120000 2.5/test/examples/from-dockerfile/Dockerfile.s2i create mode 120000 2.5/test/examples/from-dockerfile/README.md create mode 120000 2.5/test/examples/rails-postgresql-persistent.json create mode 120000 2.5/test/examples/rails-postgresql.json create mode 120000 2.5/test/examples/rails.json diff --git a/2.5/test/examples b/2.5/test/examples deleted file mode 120000 index d15735c1..00000000 --- a/2.5/test/examples +++ /dev/null @@ -1 +0,0 @@ -../../examples \ No newline at end of file diff --git a/2.5/test/examples/from-dockerfile/Dockerfile b/2.5/test/examples/from-dockerfile/Dockerfile new file mode 100644 index 00000000..6cb7ac8b --- /dev/null +++ b/2.5/test/examples/from-dockerfile/Dockerfile @@ -0,0 +1,7 @@ +FROM ubi8/ruby-25 + +ADD --chown=default:root app-src ./ + +RUN bundle install --path bundle + +CMD exec bundle exec "rackup -P /tmp/rack.pid --host 0.0.0.0 --port 8080" diff --git a/2.5/test/examples/from-dockerfile/Dockerfile.s2i b/2.5/test/examples/from-dockerfile/Dockerfile.s2i new file mode 120000 index 00000000..dfdb4e5c --- /dev/null +++ b/2.5/test/examples/from-dockerfile/Dockerfile.s2i @@ -0,0 +1 @@ +../../../../examples/from-dockerfile/Dockerfile.s2i \ No newline at end of file diff --git a/2.5/test/examples/from-dockerfile/README.md b/2.5/test/examples/from-dockerfile/README.md new file mode 120000 index 00000000..d9718e97 --- /dev/null +++ b/2.5/test/examples/from-dockerfile/README.md @@ -0,0 +1 @@ +../../../../examples/from-dockerfile/README.md \ No newline at end of file diff --git a/2.5/test/examples/rails-postgresql-persistent.json b/2.5/test/examples/rails-postgresql-persistent.json new file mode 120000 index 00000000..bfc3fbd5 --- /dev/null +++ b/2.5/test/examples/rails-postgresql-persistent.json @@ -0,0 +1 @@ +../../../examples/rails-postgresql-persistent.json \ No newline at end of file diff --git a/2.5/test/examples/rails-postgresql.json b/2.5/test/examples/rails-postgresql.json new file mode 120000 index 00000000..2a487a87 --- /dev/null +++ b/2.5/test/examples/rails-postgresql.json @@ -0,0 +1 @@ +../../../examples/rails-postgresql.json \ No newline at end of file diff --git a/2.5/test/examples/rails.json b/2.5/test/examples/rails.json new file mode 120000 index 00000000..41953b6b --- /dev/null +++ b/2.5/test/examples/rails.json @@ -0,0 +1 @@ +../../../examples/rails.json \ No newline at end of file