gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:54:13 25 4
gpt4 key购买 nike

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

  • 我们如何设置 web 容器(rails 应用程序)和 sidekiq 工作器以水平扩展(最好作为单独的容器)。
  • 自从sidekiq、ui容器使用同一个镜像后,我们应该如何管理数据库迁移
  • 我正在尝试使用以下代码段,这是正确的还是应该有所不同?

  • 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 应用程序应该有不同的图像 .这样,您可以确保 whenever -w将仅在背景 (sidekiq) 图像中调用,而不是在 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

    关于“水平缩放”,如果您有多个 sidekiq 实例使用同一个 redis 池,这应该自动完成 - sidekiq 实例越多,您的作业运行得越快。

    如果“水平”是指能够设置您的 cron 将在哪些服务器上运行,您可以有多个 schedule.rb 文件,并且您的每个后台容器应该只将其中一个部署到 crontab,通过执行 whenever -w -f config/schedule_specific_cron1.rb .您可以将文件作为环境变量传递。
  • 迁移

  • 如果所有应用程序容器都使用相同的数据库,则只让其中一个执行迁移。这将加速您的容器启动并避免任何锁定错误。
    我建议在“网络”图像中这样做,因为您将有多个 sidekiq 容器实例。
  • gem

  • 您的所有图像都将使用相同的 gem 。因此,您要创建一个卷来存储它们,以加快它们的构建过程:
    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
  • 编排

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

    应按此顺序运行依赖项:
  • 运行数据库容器
  • 运行 redis 容器
  • 运行 web 容器和后台任务容器

  • 理想情况下,您应该使用允许您指定所需数量的 sidekiq 容器实例的东西。

    ——

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

    关于ruby-on-rails - 除了应用程序之外,如何在单独的不同 docker 容器中运行 sidekiq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61862399/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com