264 lines
7.8 KiB
Groff
264 lines
7.8 KiB
Groff
.TH Ruby 2.6 container image
|
|
.PP
|
|
This container image includes Ruby 2.6 as a S2I
|
|
\[la]https://github.com/openshift/source-to-image\[ra] base image for your Ruby 2.6 applications.
|
|
Users can choose between RHEL, CentOS and Fedora based builder images.
|
|
The RHEL images are available in the Red Hat Container Catalog
|
|
\[la]https://access.redhat.com/containers/\[ra],
|
|
the CentOS images are available on Docker Hub
|
|
\[la]https://hub.docker.com/r/centos/\[ra],
|
|
and the Fedora images are available in Fedora Registry
|
|
\[la]https://registry.fedoraproject.org/\[ra]\&.
|
|
The resulting image can be run using podman
|
|
\[la]https://github.com/containers/libpod\[ra]\&.
|
|
|
|
.PP
|
|
Note: while the examples in this README are calling \fB\fCpodman\fR, you can replace any such calls by \fB\fCdocker\fR with the same arguments
|
|
|
|
.SH Description
|
|
.PP
|
|
Ruby 2.6 available as container is a base platform for
|
|
building and running various Ruby 2.6 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.
|
|
|
|
.PP
|
|
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.
|
|
|
|
.SH Usage
|
|
.PP
|
|
For this, we will assume that you are using the \fB\fCubi8/ruby\-26 image\fR, available via \fB\fCruby:2.6\fR imagestream tag in Openshift.
|
|
Building a simple ruby\-sample\-app
|
|
\[la]https://github.com/sclorg/s2i-ruby-container/tree/master/2.6/test/puma-test-app\[ra] application
|
|
in Openshift can be achieved with the following step:
|
|
|
|
.PP
|
|
.RS
|
|
|
|
.nf
|
|
```
|
|
$ oc new\-app ruby:2.6\~https://github.com/sclorg/s2i\-ruby\-container.git \-\-context\-dir=2.6/test/puma\-test\-app/
|
|
```
|
|
|
|
.fi
|
|
.RE
|
|
|
|
.PP
|
|
The same application can also be built using the standalone S2I
|
|
\[la]https://github.com/openshift/source-to-image\[ra] application on systems that have it available:
|
|
|
|
.PP
|
|
.RS
|
|
|
|
.nf
|
|
```
|
|
$ s2i build https://github.com/sclorg/s2i\-ruby\-container.git \-\-context\-dir=2.6/test/puma\-test\-app/ ubi8/ruby\-26 ruby\-sample\-app
|
|
```
|
|
|
|
.fi
|
|
.RE
|
|
|
|
.PP
|
|
\fBAccessing the application:\fP
|
|
|
|
.PP
|
|
.RS
|
|
|
|
.nf
|
|
$ curl 127.0.0.1:8080
|
|
|
|
.fi
|
|
.RE
|
|
|
|
.SH Environment variables
|
|
.PP
|
|
To set these environment variables, you can place them as a key value pair into a \fB\fC\&.s2i/environment\fR
|
|
file inside your source code repository.
|
|
|
|
.RS
|
|
.IP \(bu 2
|
|
|
|
.PP
|
|
\fBRACK\_ENV\fP
|
|
.PP
|
|
This variable specifies the environment where the Ruby application will be deployed (unless overwritten) \- \fB\fCproduction\fR, \fB\fCdevelopment\fR, \fB\fCtest\fR\&.
|
|
Each level has different behaviors in terms of logging verbosity, error pages, ruby gem installation, etc.
|
|
|
|
.PP
|
|
\fBNote\fP: Application assets will be compiled only if the \fB\fCRACK\_ENV\fR is set to \fB\fCproduction\fR
|
|
.IP \(bu 2
|
|
|
|
.PP
|
|
\fBDISABLE\_ASSET\_COMPILATION\fP
|
|
.PP
|
|
This variable set to \fB\fCtrue\fR indicates that the asset compilation process will be skipped. Since this only takes place
|
|
when the application is run in the \fB\fCproduction\fR environment, it should only be used when assets are already compiled.
|
|
.IP \(bu 2
|
|
|
|
.PP
|
|
\fBPUMA\_MIN\_THREADS\fP, \fBPUMA\_MAX\_THREADS\fP
|
|
.PP
|
|
These variables indicate the minimum and maximum threads that will be available in Puma
|
|
\[la]https://github.com/puma/puma\[ra]\&'s thread pool.
|
|
.IP \(bu 2
|
|
|
|
.PP
|
|
\fBPUMA\_WORKERS\fP
|
|
.PP
|
|
This variable indicate the number of worker processes that will be launched. See documentation on Puma's clustered mode
|
|
\[la]https://github.com/puma/puma#clustered-mode\[ra]\&.
|
|
.IP \(bu 2
|
|
|
|
.PP
|
|
\fBRUBYGEM\_MIRROR\fP
|
|
.PP
|
|
Set this variable to use a custom RubyGems mirror URL to download required gem packages during build process.
|
|
|
|
.RE
|
|
|
|
.SH Hot deploy
|
|
.PP
|
|
In order to dynamically pick up changes made in your application source code, you need to make following steps:
|
|
|
|
.RS
|
|
.IP \(bu 2
|
|
|
|
.PP
|
|
\fBFor Ruby on Rails applications\fP
|
|
.PP
|
|
Run the built Rails image with the \fB\fCRAILS\_ENV=development\fR environment variable passed to the podman
|
|
\[la]https://github.com/containers/libpod\[ra] \fB\fC\-e\fR run flag:
|
|
|
|
.PP
|
|
.RS
|
|
|
|
.nf
|
|
$ podman run \-e RAILS\_ENV=development \-p 8080:8080 rails\-app
|
|
|
|
.fi
|
|
.RE
|
|
.IP \(bu 2
|
|
|
|
.PP
|
|
\fBFor other types of Ruby applications (Sinatra, Padrino, etc.)\fP
|
|
.PP
|
|
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:
|
|
|
|
.RS
|
|
.IP \(bu 2
|
|
Shotgun
|
|
\[la]https://github.com/rtomayko/shotgun\[ra]
|
|
.IP \(bu 2
|
|
Rerun
|
|
\[la]https://github.com/alexch/rerun\[ra]
|
|
.IP \(bu 2
|
|
Rack\-livereload
|
|
\[la]https://github.com/johnbintz/rack-livereload\[ra]
|
|
|
|
.RE
|
|
|
|
.PP
|
|
Please note that in order to be able to run your application in development mode, you need to modify the S2I run script
|
|
\[la]https://github.com/openshift/source-to-image#anatomy-of-a-builder-image\[ra], so the web server is launched by the chosen gem, which checks for changes in the source code.
|
|
|
|
.PP
|
|
After you built your application image with your version of S2I run script
|
|
\[la]https://github.com/openshift/source-to-image#anatomy-of-a-builder-image\[ra], run the image with the RACK\_ENV=development environment variable passed to the podman
|
|
\[la]https://github.com/containers/libpod\[ra] \-e run flag:
|
|
|
|
.PP
|
|
.RS
|
|
|
|
.nf
|
|
$ podman run \-e RACK\_ENV=development \-p 8080:8080 sinatra\-app
|
|
|
|
.fi
|
|
.RE
|
|
|
|
.RE
|
|
|
|
.PP
|
|
To change your source code in running container, use Podman's exec
|
|
\[la]https://github.com/containers/libpod\[ra] command:
|
|
|
|
.PP
|
|
.RS
|
|
|
|
.nf
|
|
$ podman exec \-it <CONTAINER\_ID> /bin/bash
|
|
|
|
.fi
|
|
.RE
|
|
|
|
.PP
|
|
After you podman exec
|
|
\[la]https://github.com/containers/libpod\[ra] into the running container, your current
|
|
directory is set to \fB\fC/opt/app\-root/src\fR, where the source code is located.
|
|
|
|
.SH Performance tuning
|
|
.PP
|
|
You can tune the number of threads per worker using the
|
|
\fB\fCPUMA\_MIN\_THREADS\fR and \fB\fCPUMA\_MAX\_THREADS\fR 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
|
|
\[la]https://github.com/puma/puma\[ra]\&'s documentation. This is determined using
|
|
the cgroup cpusets
|
|
\[la]https://www.kernel.org/doc/Documentation/cgroup-v1/cpusets.txt\[ra]
|
|
subsystem. You can specify the cores that the container is allowed to use by passing
|
|
the \fB\fC\-\-cpuset\-cpus\fR parameter to the podman
|
|
\[la]https://github.com/containers/libpod\[ra] run command:
|
|
|
|
.PP
|
|
.RS
|
|
|
|
.nf
|
|
$ podman run \-e PUMA\_MAX\_THREADS=32 \-\-cpuset\-cpus='0\-2,3,5' \-p 8080:8080 sinatra\-app
|
|
|
|
.fi
|
|
.RE
|
|
|
|
.PP
|
|
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:
|
|
|
|
.PP
|
|
.RS
|
|
|
|
.nf
|
|
50 + 15 * WORKERS + 0.125 * WORKERS * PUMA\_MAX\_THREADS
|
|
|
|
.fi
|
|
.RE
|
|
|
|
.PP
|
|
You can specify a memory limit using the \fB\fC\-\-memory\fR flag:
|
|
|
|
.PP
|
|
.RS
|
|
|
|
.nf
|
|
$ podman run \-e PUMA\_MAX\_THREADS=32 \-\-memory=300m \-p 8080:8080 sinatra\-app
|
|
|
|
.fi
|
|
.RE
|
|
|
|
.PP
|
|
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 \fB\fCPUMA\_WORKERS\fR\&.
|
|
|
|
.SH See also
|
|
.PP
|
|
Dockerfile and other sources are available on
|
|
\[la]https://github.com/sclorg/s2i-ruby-container\[ra]\&.
|
|
In that repository you also can find another versions of Ruby environment Dockerfiles.
|
|
Dockerfile for CentOS is called \fB\fCDockerfile\fR, Dockerfile for RHEL7 is called \fB\fCDockerfile.rhel7\fR,
|
|
for RHEL8 it's \fB\fCDockerfile.rhel8\fR and the Fedora Dockerfile is called Dockerfile.fedora.
|