You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署Ruby脚本:实现启动自动运行并保持容器持续运行

解决Ruby/Rails脚本容器化后自动运行并保持容器存活的问题

首先先修正你Dockerfile里的基础错误,这些错误会导致容器构建或运行异常:

修正后的基础Dockerfile

FROM ruby:3.2.2
RUN apt-get update -qq && apt-get install -y build-essential
# 统一环境变量名大小写,避免引用错误
ENV APP_DIR="/home/user/project_dir"
WORKDIR $APP_DIR
# 复制Gemfile相关文件安装依赖
COPY Gemfile* ./
RUN bundle install
# 复制本地项目文件到容器指定目录
COPY . $APP_DIR

接下来针对你的需求(脚本在Rails环境运行+容器长期存活),提供三种可行方案:


方案1:用Rails Runner执行长期运行的脚本(推荐)

如果你的ruby_app.rb是需要持续运行的任务(比如监听消息队列、循环处理数据),直接用rails runner加载完整Rails环境执行脚本即可,脚本自身的阻塞逻辑会让容器保持运行:

在修正后的Dockerfile末尾添加:

CMD ["bundle", "exec", "rails", "runner", "/home/user/project_dir/ruby_app.rb"]

注意:如果你的脚本是一次性任务(执行完就结束),容器还是会退出,这时候需要修改脚本,加入长期运行的逻辑,比如:

# ruby_app.rb 示例:无限循环处理任务
loop do
  # 你的数据处理逻辑
  puts "正在处理数据..."
  sleep 60 # 每隔60秒执行一次
end

方案2:执行一次性脚本后保持容器存活(调试用)

如果脚本是一次性处理任务,但你需要容器保持运行以便后续调试或操作,可以在脚本执行后追加挂起命令:

在Dockerfile末尾添加:

CMD ["sh", "-c", "bundle exec rails runner /home/user/project_dir/ruby_app.rb && tail -f /dev/null"]

这种方式脚本执行完毕后,容器会通过tail -f /dev/null保持存活,但没有实际业务运行,仅适合调试场景。


方案3:在Rails控制台自动加载脚本并保持交互

如果必须在Rails控制台环境中运行脚本,且需要保持控制台会话(方便后续手动操作),可以创建一个启动脚本:

  1. 在项目根目录创建start_script.sh文件:
#!/bin/bash
# 先加载脚本并执行
bundle exec rails c << EOF
load '/home/user/project_dir/ruby_app.rb'
# 如果脚本有入口方法,比如MyProcessor.call,在这里调用
# MyProcessor.call
EOF
# 保持控制台交互会话
exec bundle exec rails c
  1. 给脚本添加执行权限,并在Dockerfile中配置:
COPY start_script.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/start_script.sh
CMD ["start_script.sh"]

运行容器时,会先自动加载执行你的脚本,然后进入Rails控制台,容器会保持运行状态。


内容的提问来源于stack exchange,提问作者YasuoPlayer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 20:20:18