centos/ruby-27-centos7该容器镜像包含Ruby 2.7,作为Source-to-Image (S2I)基础镜像,用于构建和运行Ruby 2.7应用程序。用户可选择基于RHEL、CentOS或Fedora的构建器镜像:RHEL镜像可在Red Hat Container Catalog获取,CentOS镜像在Quay.io,Fedora镜像在Fedora Registry。生成的镜像可使用podman运行。
注意:本文档示例中使用
podman命令,所有此类命令均可替换为docker,参数保持不变。
Ruby 2.7容器镜像是构建和运行各类Ruby 2.7应用程序及框架的基础平台。Ruby是一种解释型脚本语言,支持快速简便的面向对象编程,具备强大的文本处理和系统管理功能(类似Perl),特点是简洁、直观且可扩展。
该容器镜像包含npm工具,用户可用于安装Web应用所需的JavaScript模块。请注意:镜像中包含的npm或nodejs版本不做保证,版本可能随时变更,nodejs仅为支持npm运行而包含。
假设使用ubi8/ruby-27镜像(通过OpenShift中的ruby:2.7镜像流标签可用)。构建简单的ruby-sample-app应用可通过以下步骤:
bashoc new-app ruby:2.7~[***]
bash$ oc get pods $ oc exec <pod> -- curl 127.0.0.1:8080
该镜像支持OpenShift中的源到镜像(S2I)构建策略。S2I是一种OpenShift框架,可简化镜像构建流程:以应用源码为输入,使用构建器镜像(如本Ruby容器镜像),输出可运行应用的新镜像。
为支持S2I框架,构建器镜像包含以下关键脚本:
/usr/libexec/s2i/assemble:用于生成包含应用制品的新镜像。该脚本接收应用源码,将其放置到镜像内的适当目录,利用Ruby应用开发中的常见模式(见下文环境变量部分)。
/usr/libexec/s2i/run:作为生成的容器镜像(含应用制品的新镜像)的默认命令。用于配置Web服务器并在8080端口启动服务。
与S2I策略相比,使用Dockerfile构建Ruby容器镜像是更灵活的方式,适用于S2I灵活性不足或在OpenShift环境外构建镜像的场景。
使用Dockerfile构建步骤如下:
bashpodman pull ubi8/ruby-27
本示例使用RHEL7镜像ubi8/ruby-27。
以示例应用[***]
bashgit clone [***] app-src
此步骤通常包括:将应用源码放入容器、安装依赖、设置默认命令。可通过两种方式实现:使用镜像内的S2I脚本,或手动配置并显式使用ruby、bundle、rackup命令。
创建如下Dockerfile:
dockerfileFROM ubi8/ruby-27 # 将应用源码添加到assemble脚本预期的目录,并设置权限以非root用户运行 USER 0 ADD app-src /tmp/src RUN chown -R 1001:0 /tmp/src USER 1001 # 设置开发模式 ENV RAILS_ENV=development # 安装依赖 RUN /usr/libexec/s2i/assemble # 设置生成镜像的默认命令 CMD /usr/libexec/s2i/run
S2I脚本用于设置和运行常见Ruby应用,更多信息见源到镜像部分。
创建如下Dockerfile:
dockerfileFROM ubi8/ruby-27 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"
bashpodman build -t ruby-app .
bashpodman run -d ruby-app
可在源码仓库的.s2i/environment文件中以键值对形式设置以下环境变量:
RACK_ENV
指定Ruby应用部署环境(除非被覆盖):production、development、test。不同环境在日志详细程度、错误页面、gem安装等方面行为不同。
注意:仅当
RACK_ENV设为production时才会编译应用资产。
DISABLE_ASSET_COMPILATION
设为true时跳过资产编译。由于资产编译仅在production环境发生,因此仅当资产已预编译时使用。
PUMA_MIN_THREADS、PUMA_MAX_THREADS
指定Puma线程池的最小和最大线程数。
PUMA_WORKERS
指定启动的工作进程数。详见Puma的集群模式文档。
RUBYGEM_MIRROR
设置自定义RubyGems镜像URL,用于构建过程中下载所需gem包。
要动态捕获应用源码变更,需执行以下步骤:
使用RAILS_ENV=development环境变量运行构建的Rails镜像,通过podman的-e参数传递:
bash$ podman run -e RAILS_ENV=development -p 8080:8080 rails-app
应用需使用能在容器内源码变更时重载服务器的gem,如:
注意:要在开发模式运行应用,需修改S2I run脚本,使Web服务器由上述gem启动以检测源码变更。
使用修改后的S2I run脚本构建应用镜像后,通过RACK_ENV=development运行:
bash$ podman run -e RACK_ENV=development -p 8080:8080 sinatra-app
使用Podman的exec命令进入容器:
bash$ podman exec -it <容器ID> /bin/bash
进入容器后,当前目录为/opt/app-root/src(源码存放位置)。
可通过PUMA_MIN_THREADS和PUMA_MAX_THREADS环境变量调整每个工作进程的线程数。此外,工作进程数由容器可用CPU核心数决定(遵循Puma文档推荐),通过cgroup的cpusets子系统确定。可通过--cpuset-cpus参数指定容器允许使用的核心:
bash$ podman run -e PUMA_MAX_THREADS=32 --cpuset-cpus='0-2,3,5' -p 8080:8080 sinatra-app
工作进程数还受cgroup内存限制影响。构建器镜像假设基础内存需求为50 MiB,每个工作进程额外需15 MiB,每个线程需128 KiB。总内存需求计算公式如下(每个工作进程有独立线程):
50 + 15 * 工作进程数 + 0.125 * 工作进程数 * PUMA_MAX_THREADS
可通过--memory参数指定内存限制:
bash$ podman run -e PUMA_MAX_THREADS=32 --memory=300m -p 8080:8080 sinatra-app
若内存限制比CPU核心数更严格,工作进程数会按上述公式相应缩减。也可通过PUMA_WORKERS显式设置工作进程数。
Dockerfile及其他源码见[***]Dockerfile,RHEL7对应Dockerfile.rhel7,RHEL8对应Dockerfile.rhel8,Fedora对应Dockerfile.fedora。


manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务