如何在一个独立的不同的docker容器中运行sidekiq,而不是应用程序。我们对sidekiq作业使用的是whenever,但作业在所有的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应用程序使用不同的图像。. 这样,你就可以确保 whenever -w
只会在背景图片(sidkiq)中被调用,而不会在网页图片中被调用。
示例图片。https:/gist.github.comcesartalves69f6440b97c89e9dee6cfffbdf9b7790。 适应
重要的几点。
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.comquestions85558verify-if-crontab-works。
关于 "水平缩放",如果你有多个sidekiq实例使用同一个redis池,那么这个功能应该是自动完成的--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:
Inside your image:
ENV BUNDLE_PATH /gems
你使用的是哪个容器协调系统?
Dependecies应该按这个顺序运行。
理想情况下,你应该使用一些允许你指定你想要多少个sidekiq容器实例的东西。
--
我想这就涵盖了要点。如果你需要更多信息,请告诉我。