繁体   English   中英

除了应用程序之外,如何在单独的不同 docker 容器中运行 sidekiq

[英]How to run sidekiq in a separate different docker container apart from application

除了应用程序之外,如何在单独的不同 docker 容器中运行 sidekiq。 我们随时使用 sidekiq 作业,但所有 web 容器中的作业都被触发

  1. 我们如何设置 web 容器(rails 应用程序)和 sidekiq 工作人员以水平扩展(最好作为单独的容器)。
  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:

这是您应该设置的内容列表:

  • 图片

您的 sidekiq 和 web 应用程序应该有不同的图像 这样,您可以确保仅在后台 (sidekiq) 图像中调用whenever -w ,而不是在 web 图像中调用。

示例图片: https://gist.github.com/cesartalves/69f6440b97c89e9dee6cfffbdf9b7790 (适应您的需求)

要点:

  • 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.com/questions/85558/verify-if-crontab-works

关于“水平缩放”,如果您有多个使用相同 redis 池的 sidekiq 实例,这应该自动完成 - 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:

在您的图像中:

ENV BUNDLE_PATH /gems

  1. 编排

您使用的是哪个容器编排系统?

依赖项应按此顺序运行:

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

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

--

我认为这涵盖了要点。 如果您需要更多信息,请与我们联系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM