
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
该容器镜像包含Ruby 2.7,作为https://github.com/openshift/source-to-image%E5%9F%BA%E7%A1%80%E9%95%9C%E5%83%8F%EF%BC%8C%E7%94%A8%E4%BA%8E%E6%9E%84%E5%BB%BA%E5%92%8C%E8%BF%90%E8%A1%8CRuby 2.7应用程序。用户可选择基于RHEL、CentOS或Fedora的构建器镜像:RHEL镜像可在Red Hat Container Catalog获取,CentOS镜像在https://quay.io/organization/centos7%EF%BC%8CFedora%E9%95%9C%E5%83%8F%E5%9C%A8https://registry.fedoraproject.org/%E3%80%82%E7%94%9F%E6%88%90%E7%9A%84%E9%95%9C%E5%83%8F%E5%8F%AF%E4%BD%BF%E7%94%A8https://github.com/containers/libpod%E8%BF%90%E8%A1%8C%E3%80%82
注意:本文档示例中使用
podman命令,所有此类命令均可替换为docker,参数保持不变。
Ruby 2.7容器镜像是构建和运行各类Ruby 2.7应用程序及框架的基础平台。Ruby是一种解释型脚本语言,支持快速简便的面向对象编程,具备强大的文本处理和系统管理功能(类似Perl),特点是简洁、直观且可扩展。
该容器镜像包含npm工具,用户可用于安装Web应用所需的JavaScript模块。请注意:镜像中包含的npm或nodejs版本不做保证,版本可能随时变更,nodejs仅为支持npm运行而包含。
假设使用ubi8/ruby-27镜像(通过OpenShift中的ruby:2.7镜像流标签可用)。构建简单的https://github.com/sclorg/s2i-ruby-container/tree/master/2.7/test/puma-test-app%E5%BA%94%E7%94%A8%E5%8F%AF%E9%80%9A%E8%BF%87%E4%BB%A5%E4%B8%8B%E6%AD%A5%E9%AA%A4%EF%BC%9A
bashoc new-app ruby:2.7~https://github.com/sclorg/rails-ex.git
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。
以示例应用https://github.com/sclorg/rails-ex.git%E4%B8%BA%E4%BE%8B%EF%BC%8C%E5%8F%AF%E5%85%8B%E9%9A%86%E4%BB%93%E5%BA%93%E8%BF%9B%E8%A1%8C%E5%AE%9E%E9%AA%8C%EF%BC%9A
bashgit clone https://github.com/sclorg/rails-ex.git app-src
此步骤通常包括:将应用源码放入容器、安装依赖、设置默认命令。可通过两种方式实现:使用镜像内的S2I脚本,或手动配置并显式使用ruby、bundle、rackup命令。
3.1 使用S2I脚本通过Dockerfile构建镜像
创建如下Dockerfile:
dockerfileFROM docker.xuanyuan.run/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应用,更多信息见源到镜像部分。
3.2 手动配置通过Dockerfile构建镜像
创建如下Dockerfile:
dockerfileFROM docker.xuanyuan.run/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
指定https://github.com/puma/puma%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%9A%84%E6%9C%80%E5%B0%8F%E5%92%8C%E6%9C%80%E5%A4%A7%E7%BA%BF%E7%A8%8B%E6%95%B0%E3%80%82
PUMA_WORKERS
指定启动的工作进程数。详见Puma的https://github.com/puma/puma#clustered-mode%E6%96%87%E6%A1%A3%E3%80%82
RUBYGEM_MIRROR
设置自定义RubyGems镜像URL,用于构建过程中下载所需gem包。
要动态捕获应用源码变更,需执行以下步骤:
使用RAILS_ENV=development环境变量运行构建的Rails镜像,通过podman的-e参数传递:
bash$ podman run -e RAILS_ENV=development -p 8080:8080 rails-app
应用需使用能在容器内源码变更时重载服务器的gem,如:
注意:要在开发模式运行应用,需修改https://github.com/openshift/source-to-image#anatomy-of-a-builder-image%EF%BC%8C%E4%BD%BFWeb%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%94%B1%E4%B8%8A%E8%BF%B0gem%E5%90%AF%E5%8A%A8%E4%BB%A5%E6%A3%80%E6%B5%8B%E6%BA%90%E7%A0%81%E5%8F%98%E6%9B%B4%E3%80%82
使用修改后的https://github.com/openshift/source-to-image#anatomy-of-a-builder-image%E6%9E%84%E5%BB%BA%E5%BA%94%E7%94%A8%E9%95%9C%E5%83%8F%E5%90%8E%EF%BC%8C%E9%80%9A%E8%BF%87%60RACK_ENV=development%60%E8%BF%90%E8%A1%8C%EF%BC%9A
bash$ podman run -e RACK_ENV=development -p 8080:8080 sinatra-app
使用Podman的https://github.com/containers/libpod%E5%91%BD%E4%BB%A4%E8%BF%9B%E5%85%A5%E5%AE%B9%E5%99%A8%EF%BC%9A
bash$ podman exec -it <容器ID> /bin/bash
进入容器后,当前目录为/opt/app-root/src(源码存放位置)。
可通过PUMA_MIN_THREADS和PUMA_MAX_THREADS环境变量调整每个工作进程的线程数。此外,工作进程数由容器可用CPU核心数决定(遵循https://github.com/puma/puma%E6%96%87%E6%A1%A3%E6%8E%A8%E8%8D%90%EF%BC%89%EF%BC%8C%E9%80%9A%E8%BF%87cgroup%E7%9A%84https://www.kernel.org/doc/Documentation/cgroup-v1/cpusets.txt%E5%AD%90%E7%B3%BB%E7%BB%9F%E7%A1%AE%E5%AE%9A%E3%80%82%E5%8F%AF%E9%80%9A%E8%BF%87%60--cpuset-cpus%60%E5%8F%82%E6%95%B0%E6%8C%87%E5%AE%9A%E5%AE%B9%E5%99%A8%E5%85%81%E8%AE%B8%E4%BD%BF%E7%94%A8%E7%9A%84%E6%A0%B8%E5%BF%83%EF%BC%9A
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及其他源码见https://github.com/sclorg/s2i-ruby-container%E3%80%82%E8%AF%A5%E4%BB%93%E5%BA%93%E8%BF%98%E5%8C%85%E5%90%AB%E5%85%B6%E4%BB%96%E7%89%88%E6%9C%ACRuby%E7%8E%AF%E5%A2%83%E7%9A%84Dockerfile%EF%BC%9ACentOS%E5%AF%B9%E5%BA%94%60Dockerfile%60%EF%BC%8CRHEL7%E5%AF%B9%E5%BA%94%60Dockerfile.rhel7%60%EF%BC%8CRHEL8%E5%AF%B9%E5%BA%94%60Dockerfile.rhel8%60%EF%BC%8CFedora%E5%AF%B9%E5%BA%94%60Dockerfile.fedora%60%E3%80%82
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务