如何在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. 部署并验证配置
- 推送代码到Dokku:
git push my-dokku-rails-app main
- 进入容器验证crontab:
dokku enter my-dokku-rails-app crontab -l
此时应能看到whenever生成的定时任务条目;同时可查看log/whenever.log确认任务执行情况。
内容的提问来源于stack exchange,提问作者user984621
相关产品推荐
相关产品推荐

