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控制台环境中运行脚本,且需要保持控制台会话(方便后续手动操作),可以创建一个启动脚本:
- 在项目根目录创建
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
- 给脚本添加执行权限,并在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
相关产品推荐
相关产品推荐

