Как мне запустить delayed_jobs в Kubernetes? - PullRequest
0 голосов
/ 30 августа 2018

Я могу войти в консоль с одного из модулей (на 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, но задания не выполняются.

Есть идеи, как правильно запустить delayed_jobs в kubernetes?

РЕДАКТИРОВАТЬ: Вот мой 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"
#########################################################

1 Ответ

0 голосов
/ 24 сентября 2018

Запуск нескольких процессов в одном док-контейнере проблематичен, так как вы не можете легко наблюдать время жизни конкретного процесса - каждому контейнеру нужен один «основной» процесс, и при выходе из него контейнер также завершается.

Как и в случае с Github (https://github.com/collectiveidea/delayed_job#user-content-running-jobs)), я настоятельно рекомендую немного изменить стартовую команду, чтобы запускать ее на переднем плане, потому что теперь, когда вы запускаете задание Kubernetes с демонами - задание немедленно заканчивается, поскольку время жизни контейнера-докера напрямую связано с временем жизни основного процесса переднего плана, поэтому при запуске только фонового процесса происходит немедленный выход из основного процесса и вашего контейнера.

Измените вашу команду на:

RAILS_ENV=production script/delayed_job run

Какой стартовый работник на переднем плане, чтобы ваша работа в Kubernetes не выходила. Также обратите внимание, что задания Kubernetes не предназначены для выполнения таких бесконечных задач (задание должно иметь начало и конец), поэтому я бы предложил использовать ReplicaSet для этого

...