我可以从其中一个Pod(在kubernetes上)登录控制台并运行以下命令:
RAILS_ENV=production bin/delayed_job start
作业可以正确运行。但是,当吊舱被删除或重新启动时,作业将停止运行。
我也尝试将上述命令添加到初始化文件(例如config / initializers / delayed_jobs_runner.rb)中,但是启动应用程序时出现递归循环。
我试图做的另一件事是用这个创建一个名为my-jobs.yaml
的新文件
apiVersion: batch/v1
kind: Job
metadata:
name: job
spec:
template:
spec:
containers:
- name: job
image: gcr.io/test-app-123/somename:latest
command: ["/bin/bash", "-l", "-c"]
args: ["RAILS_ENV=production bundle exec rake jobs:work"]
restartPolicy: Never
backoffLimit: 4
然后我做kubectl apply -f my-jobs.yaml
,但是作业没有运行。
有什么想法如何在kubernetes中正确运行delay_jobs吗?
编辑:这是我的Dockerfile:
FROM gcr.io/google_appengine/ruby
# Install 2.5.1 if not already preinstalled by the base image
RUN cd /rbenv/plugins/ruby-build && \
git pull && \
rbenv install -s 2.5.1 && \
rbenv global 2.5.1 && \
gem install -q --no-rdoc --no-ri bundler
# --version 1.11.2
ENV RBENV_VERSION 2.5.1
# Copy the application files.
COPY . /app/
# Install required gems.
RUN bundle install --deployment && rbenv rehash
# Set environment variables.
ENV RACK_ENV=production \
RAILS_ENV=production \
RAILS_SERVE_STATIC_FILES=true
# Run asset pipeline.
RUN bundle exec rake assets:precompile
CMD ["setup.sh"]
# Reset entrypoint to override base image.
ENTRYPOINT ["/bin/bash"]
################### setup.sh ############################
cd /app && RAILS_ENV=production bundle exec script/delayed_job -n 2 start
bundle exec foreman start --formation "$FORMATION"
#########################################################
答案 0 :(得分:2)
现在我正在这样做:
this_pid=$$
(while [[ $(ps -ef | grep delayed_job | grep -v -e grep -e tail | head -c1 | wc -c) -ne 0 ]]; do sleep 10; done; kill -- -$this_pid) &
启动多名工作人员后。然后,我tail -f
记录日志,使它们进入容器的标准输出。我非常疯狂,因此我也运行logrotate来检查日志。不管怎样,rails环境都很大,因此容器需要很大,我们需要能够运行许多工作,而我不希望运行太多的pod。这似乎是有效的,并且如果工人由于某种原因死亡,将停止并重新启动。
答案 1 :(得分:1)
您尚未发布Dockerfile,但通常来说,您在CMD
的{{1}}指令中运行了多个命令。
首先,将要运行的命令放入bash脚本(称为Dockerfile
):
setup.sh
然后在您的Dockerfile中...
RAILS_ENV=production bundle exec rake jobs:work
RAILS_ENV=production rails server (start your rails server)
这应该在Rails服务器启动之前运行作业。
答案 2 :(得分:1)
在一个docker容器中运行多个进程是有问题的,因为您无法轻松观察特定进程的生命周期-每个容器都需要一个“主”进程,并且当退出时,容器也会退出。
在查看Github(https://github.com/collectiveidea/delayed_job#user-content-running-jobs)时,我强烈建议您更改一些启动命令以使其在前台运行,因为现在当您使用守护程序启动Kubernetes作业时 -作业即将结束,因为docker容器的生存期与“主”前台进程的生存期直接相关,因此,当您仅运行后台进程时,主进程会立即退出,您的容器也会退出。
将命令更改为:
RAILS_ENV=production script/delayed_job run
什么在前台启动工作人员,以便您的Kubernetes工作不会退出。另请注意,Kubernetes Jobs并非用于此类不定式的任务(job应该有开始和结束),所以我建议为此使用ReplicaSet