如何在一个独立的不同的docker容器中运行sidekiq,而不是应用。

问题描述 投票:2回答:1

如何在一个独立的不同的docker容器中运行sidekiq,而不是应用程序。我们对sidekiq作业使用的是whenever,但作业在所有的web容器中都被触发了。

  1. 我们如何设置web容器(rails应用)和sidekiq worker,使其也能水平扩展(最好是作为单独的容器)。
  2. 由于sidekiq和ui容器使用的是同一个镜像,我们应该如何管理数据库的迁移。
  3. 我正在尝试使用下面的代码段,这是正确的吗,还是应该有什么不同?
version: '3.8'

services:
  foo-db:
    image: postgres:$POSTGRES_VERSION
    container_name: foo-db-container
    restart: unless-stopped
    env_file: .env
    volumes:
      - /var/lib/postgresql/data
    networks:
      - $FOO_NETWORK

  foo-redis:
    image: redis:$REDIS_VERSION
    container_name: foo-redis-container
    init: true
    sysctls:
      net.core.somaxconn: 511
    env_file: .env
    volumes:
      - /var/lib/redis/data
    networks:
      - $FOO_NETWORK

  foo-sidekiq:
    depends_on:
      - foo-db
      - foo-redis
    build: ./foo-ui
    command: bundle exec sidekiq
    env_file: .env
    volumes:
      - /var/lib/redis/data
    networks:
      - $FOO_NETWORK

  foo-service:
    build: foo-service
    # image: gcr.io/foo/foo-service:latest
    container_name: foo-service-container
    ports:
      - "$FOO_SERVICE_PORT:$FOO_SERVICE_PORT"
    env_file: .env
    networks:
      - $FOO_NETWORK

  foo-ui:
    build: ./foo-ui
    # image: gcr.io/foo/foo-ui:latest
    container_name: foo-ui-container
    depends_on:
      - foo-db
      - foo-redis
      - foo-sidekiq
      - foo-service
    ports:
      - "$FOO_UI_PORT:$FOO_UI_PORT"
    env_file: .env
    networks:
      - $FOO_NETWORK

networks:
  foo-network:
ruby-on-rails docker docker-compose sidekiq whenever
1个回答
2
投票

以下是你应该设置的事项列表。

  • 图片

你应该为你的sidekiq和web应用程序使用不同的图像。. 这样,你就可以确保 whenever -w 只会在背景图片(sidkiq)中被调用,而不会在网页图片中被调用。

示例图片。https:/gist.github.comcesartalves69f6440b97c89e9dee6cfffbdf9b7790。 适应

重要的几点。

  • apt-get update && apt-get install -y cron - 安装crontab
  • bundle exec whenever -w - 每当
  • CMD [ "bundle", "exec", "sidekiq" - 将sidekiq作为主进程运行
  • ENTRYPOINT [ "./docker-entrypoint.sh" ] - 在后台运行cron和其他你可能需要做的附加命令。

要检查crontab是否在运行,可以在容器运行后执行以下操作之一。https:/askubuntu.comquestions85558verify-if-crontab-works。

关于 "水平缩放",如果你有多个sidekiq实例使用同一个redis池,那么这个功能应该是自动完成的--sidekiq实例越多,作业运行的速度越快。

如果你说的 "横向 "是指能够设置你的crons将在哪些服务器上运行,你可以有多个schedule.rb文件,每个后台容器只需将其中的一个部署到crontab上,具体做法是这样的 whenever -w -f config/schedule_specific_cron1.rb. 你可以将该文件作为环境变量传递。

  1. 迁移

如果所有的应用容器都使用相同的数据库,那么只让其中一个容器执行迁移。这将加快你的容器启动速度,并避免任何锁定错误。我建议在 "web "图像中这样做,因为你将有多个sidekiq容器实例。

  1. 宝石

您的所有图像都将使用相同的宝石。因此,你要创建一个体积来存储它们,以加快它们的构建过程。

foo-sidekiq:
    depends_on:
      - foo-db
      - foo-redis
    build: ./foo-ui
    command: bundle exec sidekiq
    env_file: .env
    volumes:
      - /var/lib/redis/data
      - gem_cache:/gems
    networks:
      - $FOO_NETWORK

volumes:
  gem_cache:

Inside your image:

ENV BUNDLE_PATH /gems

  1. Orchestration

你使用的是哪个容器协调系统?

Dependecies应该按这个顺序运行。

  1. 运行数据库容器
  2. 运行redis容器
  3. 运行网络容器和后台任务容器

理想情况下,你应该使用一些允许你指定你想要多少个sidekiq容器实例的东西。

--

我想这就涵盖了要点。如果你需要更多信息,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.