该容器镜像包含Ruby 2.5,作为Source-to-Image (S2I)基础镜像,用于构建和运行Ruby 2.5应用程序。用户可选择基于RHEL、CentOS或Fedora的构建器镜像:RHEL镜像可在Red Hat Container Catalog获取,CentOS镜像可在Quay.io获取,Fedora镜像可在Fedora Registry获取。生成的镜像可使用podman运行。
注意:本文档中的示例使用
podman命令,所有此类命令均可替换为docker,参数保持不变。
Ruby 2.5容器镜像是构建和运行各种Ruby 2.5应用程序及框架的基础平台。Ruby是一种解释型脚本语言,适用于快速简便的面向对象编程,具有处理文本文件和执行系统管理任务的丰富功能(类似Perl),其语法简洁直观且可扩展。
该镜像包含npm工具,用户可用于安装Web应用所需的JavaScript模块。但不保证镜像中包含特定版本的npm或nodejs,这些版本可能随时变更,nodejs仅为支持npm功能而包含。
假设使用ubi8/ruby-25镜像(在OpenShift中可通过ruby:2.5镜像流标签获取),构建简单的ruby-sample-app应用可通过以下步骤实现:
oc new-app ruby:2.5~[***]
$ 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。
使用Ruby镜像构建Dockerfile的步骤如下:
podman pull ubi8/ruby-25
本示例使用RHEL7镜像ubi8/ruby-25。
以[***]
git clone [***] app-src
此步骤通常至少包括:将应用源码放入容器、安装依赖、设置生成镜像的默认命令。可通过两种方式实现:使用镜像内的S2I脚本(3.1),或手动配置并显式使用ruby、bundle和rackup命令(3.2)。
创建如下Dockerfile:
FROM ubi8/ruby-25 # 将应用源码添加到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:
FROM ubi8/ruby-25 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"
podman build -t ruby-app .
podman run -d ruby-app
可在源码仓库的.s2i/environment文件中以键值对形式设置以下环境变量:
RACK_ENV
指定Ruby应用的部署环境(除非被覆盖):production、development、test。不同环境在日志详细程度、错误页面、Ruby gem安装等方面有不同行为。
注意:仅当RACK_ENV设为production时才会编译应用资产。
DISABLE_ASSET_COMPILATION
设为true时跳过资产编译过程。仅在应用运行于production环境时生效,应仅在资产已预编译时使用。
PUMA_MIN_THREADS、PUMA_MAX_THREADS
指定Puma线程池的最小和最大线程数。
PUMA_WORKERS
指定启动的工作进程数。详见Puma的集群模式文档。
RUBYGEM_MIRROR
设置自定义RubyGems镜像URL,用于在构建过程中下载所需gem包。
要动态获取应用源码的变更,需执行以下步骤:
Ruby on Rails应用
使用RAILS_ENV=development环境变量运行构建的Rails镜像,通过podman的-e参数传递:
$ podman run -e RAILS_ENV=development -p 8080:8080 rails-app
其他Ruby应用(Sinatra、Padrino等)
应用需使用能在容器内源码变更时重新加载服务器的gem,如:
注意,要在开发模式运行应用,需修改S2I run脚本,使Web服务器由所选gem启动,以检测源码变更。
使用修改后的S2I run脚本构建应用镜像后,通过podman的-e参数传递RACK_ENV=development运行:
$ podman run -e RACK_ENV=development -p 8080:8080 sinatra-app
要在运行中的容器内修改源码,使用Podman的exec命令:
$ podman exec -it <CONTAINER_ID> /bin/bash
执行上述命令后,当前目录为/opt/app-root/src,即源码所在位置。
可通过PUMA_MIN_THREADS和PUMA_MAX_THREADS环境变量调整每个工作进程的线程数。此外,工作进程数由容器可用CPU核心数决定(遵循Puma文档建议),通过cgroup的cpusets子系统确定。可通过podman run命令的--cpuset-cpus参数指定容器允许使用的核心:
$ 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 * WORKERS + 0.125 * WORKERS * PUMA_MAX_THREADS
可通过--memory标志指定内存限制:
$ 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。
来自真实用户的反馈,见证轩辕镜像的优质服务
免费版仅支持 Docker Hub 加速,不承诺可用性和速度;专业版支持更多镜像源,保证可用性和稳定速度,提供优先客服响应。
免费版仅支持 docker.io;专业版支持 docker.io、gcr.io、ghcr.io、registry.k8s.io、nvcr.io、quay.io、mcr.microsoft.com、docker.elastic.co 等。
当返回 402 Payment Required 错误时,表示流量已耗尽,需要充值流量包以恢复服务。
通常由 Docker 版本过低导致,需要升级到 20.x 或更高版本以支持 V2 协议。
先检查 Docker 版本,版本过低则升级;版本正常则验证镜像信息是否正确。
使用 docker tag 命令为镜像打上新标签,去掉域名前缀,使镜像名称更简洁。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
在 Linux 系统配置镜像加速服务
在 Docker Desktop 配置镜像加速
Docker Compose 项目配置加速
Kubernetes 集群配置 Containerd
在宝塔面板一键配置镜像加速
Synology 群晖 NAS 配置加速
飞牛 fnOS 系统配置镜像加速
极空间 NAS 系统配置加速服务
爱快 iKuai 路由系统配置加速
绿联 NAS 系统配置镜像加速
QNAP 威联通 NAS 配置加速
Podman 容器引擎配置加速
HPC 科学计算容器配置加速
ghcr、Quay、nvcr 等镜像仓库
无需登录使用专属域名加速
需要其他帮助?请查看我们的 常见问题 或 官方QQ群: 13763429