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

如何在Rails 7+Dokku生产环境配置Whenever gem创建CRON任务?

在Dokku中正确配置Whenever Gem的方法

你遇到的核心问题是:Docker镜像构建阶段生成的crontab未在运行时生效,且容器未启动cron服务。以下是分步解决方案:

1. 调整Gemfile确保whenever可用

确保whenever已加入Gemfile,且生产环境可加载:

# Gemfile
gem 'whenever', require: false

2. 修改Dockerfile,完善cron环境

之前的Dockerfile存在三个关键问题:build阶段生成的root用户crontab无法被rails用户读取、最终镜像未安装cron、容器未同时启动cron与Rails服务。修改后的完整Dockerfile如下:

# syntax = docker/dockerfile:1

ARG RUBY_VERSION=3.2.2
FROM registry.docker.com/library/ruby:$RUBY_VERSION-slim as base

WORKDIR /rails

ENV RAILS_ENV="production" \
    BUNDLE_DEPLOYMENT="1" \
    BUNDLE_PATH="/usr/local/bundle" \
    BUNDLE_WITHOUT="development" 

FROM base as build

RUN apt-get update -qq && \
    apt-get install --no-install-recommends -y build-essential curl git libvips node-gyp pkg-config python-is-python3 libpq-dev

COPY Gemfile Gemfile.lock ./
RUN bundle install && \
    rm -rf ~/.bundle/ "${BUNDLE_PATH}"/ruby/*/cache "${BUNDLE_PATH}"/ruby/*/bundler/gems/*/.git && \
    bundle exec bootsnap precompile --gemfile

COPY . .

RUN bundle exec bootsnap precompile app/ lib/

ARG RAILS_MASTER_KEY
RUN SECRET_KEY_BASE_DUMMY=1 ./bin/rails assets:precompile

FROM base

RUN apt-get update -qq && \
    apt-get install --no-install-recommends -y curl libvips postgresql-client cron && \
    rm -rf /var/lib/apt/lists /var/cache/apt/archives

COPY --from=build /usr/local/bundle /usr/local/bundle
COPY --from=build /rails /rails

# 创建rails用户并设置目录权限
RUN useradd rails --create-home --shell /bin/bash && \
    chown -R rails:rails db log storage tmp

# 切换到rails用户,生成当前用户的crontab
USER rails:rails
RUN bundle exec whenever --update-crontab --set environment='production'

# 复制启动脚本并赋予执行权限
COPY start.sh /rails/start.sh
RUN chmod +x /rails/start.sh

ENTRYPOINT ["/rails/bin/docker-entrypoint"]

EXPOSE 3000
CMD ["/rails/start.sh"]

3. 创建启动脚本同时启动cron与Rails服务

在项目根目录创建start.sh文件,内容如下:

#!/bin/bash
# 启动cron服务
cron
# 启动Rails服务器
./bin/rails server

4. 部署并验证配置

  1. 推送代码到Dokku:
git push my-dokku-rails-app main
  1. 进入容器验证crontab:
dokku enter my-dokku-rails-app
crontab -l

此时应能看到whenever生成的定时任务条目;同时可查看log/whenever.log确认任务执行情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 09:35:11