Skip to main content
 首页 » 编程设计

ruby-on-rails之rails,when 和 docker之cron 任务不运行

2025年12月25日40落叶无声

我的任务来自 schedule.rb不适用于 docker 容器,但 crontab -l结果已包含此行:

# Begin Whenever generated tasks for: /app/config/schedule.rb 
45 19 * * * /bin/bash -l -c 'bundle exec rake stats:cleanup' 
45 19 * * * /bin/bash -l -c 'bundle exec rake stats:count' 
0 5 * * * /bin/bash -l -c 'bundle exec rake stats:history' 
# End Whenever generated tasks for: /app/config/schedule.rb 

我可以在容器中手动运行此命令并且它可以工作。似乎 cron 没有启动。

Dockerfile:
FROM ruby:2.4.0-slim 
RUN apt-get update 
RUN apt-get install -qq -y --no-install-recommends build-essential libpq-dev cron postgresql-client 
RUN cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime 
ENV LANG C.UTF-8 
ENV RAILS_ENV production 
ENV INSTALL_PATH /app 
RUN mkdir $INSTALL_PATH 
RUN touch /log/cron.log 
ADD Gemfile Gemfile.lock ./ 
WORKDIR $INSTALL_PATH 
RUN bundle install --binstubs --without development test 
COPY . . 
RUN bundle exec whenever --update-crontab 
RUN service cron start 
ENTRYPOINT ["bundle", "exec", "puma"] 

请您参考如下方法:

在 Dockerfile 中,RUN 命令仅在构建镜像时执行。

如果你想在启动容器时启动 cron,你应该运行 cronCMD .我通过删除 RUN service cron start 修改了您的 Dockerfile并更改您的 ENTRYPOINT .

FROM ruby:2.4.0-slim 
RUN apt-get update 
RUN apt-get install -qq -y --no-install-recommends build-essential libpq-dev cron postgresql-client 
RUN cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime 
ENV LANG C.UTF-8 
ENV RAILS_ENV production 
ENV INSTALL_PATH /app 
RUN mkdir $INSTALL_PATH 
RUN touch /log/cron.log 
ADD Gemfile Gemfile.lock ./ 
WORKDIR $INSTALL_PATH 
RUN bundle install --binstubs --without development test 
COPY . . 
RUN bundle exec whenever --update-crontab 
CMD cron && bundle exec puma 

最好的做法是减少图像的层数,例如,您应该始终在同一 RUN 语句中将 RUN apt-get update 与 apt-get install 结合使用,并在以下位置清除 apt 文件: rm -rf /var/lib/apt/lists/*
FROM ruby:2.4.0-slim 
RUN apt-get update && \ 
  apt-get install -qq -y --no-install-recommends build-essential libpq-dev cron postgresql-client \ 
  rm -rf /var/lib/apt/lists/* && \ 
  cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime 
ENV LANG C.UTF-8 
ENV RAILS_ENV production 
ENV INSTALL_PATH /app 
RUN mkdir $INSTALL_PATH && \ 
  touch /log/cron.log 
ADD Gemfile Gemfile.lock ./ 
WORKDIR $INSTALL_PATH 
RUN bundle install --binstubs --without development test 
COPY . . 
RUN bundle exec whenever --update-crontab 
CMD cron && bundle exec puma