簡體   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