![](/img/trans.png)
[英]Access rails active storage objects from sidekiq in different docker container
[英]How to run sidekiq in a separate different docker container apart from application
除了應用程序之外,如何在單獨的不同 docker 容器中運行 sidekiq。 我們隨時使用 sidekiq 作業,但所有 web 容器中的作業都被觸發
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
- 安裝 crontabbundle 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
。 您可以將文件作為環境變量傳遞。
如果所有應用程序容器都使用同一個數據庫,則只讓其中一個執行遷移。 這將加速您的容器啟動並避免任何鎖定錯誤。 我建議在“web”圖像中這樣做,因為您將擁有多個 sidekiq 容器實例。
您的所有圖像都將使用相同的寶石。 因此,您要創建一個卷來存儲它們,以加快它們的構建過程:
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
您使用的是哪個容器編排系統?
依賴項應按此順序運行:
理想情況下,您應該使用允許您指定需要多少個 sidekiq 容器實例的東西。
--
我認為這涵蓋了要點。 如果您需要更多信息,請與我們聯系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.