我想使用Docker创建一个容器,该容器将负责根据Whenever gem的配置启动重复的rake任务。我有一个具有以下结构的纯红宝石项目(无rails / sinatra):
宝石文件:
source 'https://rubygems.org'
gem 'rake', '~> 12.3', '>= 12.3.1'
gem 'whenever', '~> 0.9.7', require: false
group :development, :test do
gem 'byebug', '~> 10.0', '>= 10.0.2'
end
group :test do
gem 'rspec', '~> 3.5'
end
config / schedule.rb :(无论何时配置)
ENV.each { |k, v| env(k, v) }
every 1.minutes do
rake 'hello:start'
end
lib / tasks / hello.rb :(耙配置)
namespace :hello do
desc 'This is a sample'
task :start do
puts 'start something!'
end
end
Dockerfile :
FROM ruby:2.5.3-alpine3.8
RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories && \
apk update && apk upgrade && \
apk add build-base bash dcron && \
apk upgrade --available && \
rm -rf /var/cache/apk/* && \
mkdir /usr/app
WORKDIR /usr/app
COPY Gemfile* /usr/app/
RUN bundle install
COPY . /usr/app
RUN bundle exec whenever --update-crontab
CMD ['sh', '-c', 'crond && gulp']
到目前为止,我已经使用以下资源
如果我使用命令行调用rake任务,则会得到想要的结果。
$ rake 'hello:start'
start something!
但是,我不知道如何使用Docker使其工作。容器已构建,但未写入日志,未显示任何输出,没有任何反应。有人可以帮助我显示我在做什么吗?
构建命令
docker build -t gsc:0.0.1 .
docker container run -a stdin -a stdout -i --net host -t gsc:0.0.1 /bin/bash
谢谢。干杯
答案 0 :(得分:1)
这是我上面列出的问题的解决方案。我在Dockerfile
和schedule.rb
遇到了一些问题。这是我必须进行更改以使其正常工作的原因。
Dockerfile
FROM ruby:2.5.3-alpine3.8
RUN apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/main && \
apk update && apk upgrade && \
apk add build-base bash dcron && \
apk upgrade --available && \
rm -rf /var/cache/apk/* && \
mkdir /usr/app
WORKDIR /usr/app
COPY Gemfile* /usr/app/
RUN bundle install
COPY . /usr/app
RUN bundle exec whenever -c && bundle exec whenever --update-crontab && touch ./log/cron.log
ENTRYPOINT crond && tail -f ./log/cron.log
config / schedule.rb
ENV.each
every 1.minutes do
rake 'hello:start'
end
更新
我创建了一个GitHub repository和一个Docker Hub repository,以与社区分享这一进展。