Sidekiq в приложении докеризированных рельсов на AWS - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть файл составления докера с этим содержимым.

version: '3'
services:
  db:
    image: postgres
    restart: always
    ports:
      - "5432:5432"
    environment:
      POSTGRES_PASSWORD: pass
      POSTGRES_USER: user
    volumes:
      - postgres_data:/var/lib/postgresql/data

  redis:
    image: "redis:alpine"
    ports:
      - "6379:6379"
    volumes:
      - 'redis:/var/lib/redis/data'

  sidekiq:
    build: .
    links:
      - db
      - redis
    command: bundle exec sidekiq
    volumes:
      - '.:/app'

  web:
    image: production_image
    ports:
      - "80:80"
    links:
      - db
      - redis
      - sidekiq
    restart: always

volumes:
  postgres_data:
  redis:

Для запуска sidekiq мы запускаем bundle exec sidekiq в текущем каталоге. Это работает на моей локальной машине в среде разработки. Но в контейнере AWS EC2 я отправляю свой файл docker-compose.yml и запускаю docker-compose up. Но поскольку код проекта отсутствует, sidekiq не работает. Как мне запустить sidekiq на экземпляре EC2, не отправляя туда свой код и используя контейнер Docker для моего кода только в файле compose?

1 Ответ

0 голосов
/ 12 сентября 2018

Две важные вещи, которые вам нужно сделать, это удалить объявление volumes:, которое получает действительный код приложения из вашей локальной файловой системы, и загрузить ваш встроенный образ Docker в какой-то реестр.Поскольку в противном случае вы используете AWS, ECR - это готовый вариант;public Docker Hub тоже будет работать нормально.

В зависимости от структуры вашего приложения на Rails, возможно, имеет смысл использовать одно и то же изображение с разными командами для основного приложения и работников Sidekiq, а такжепостарайтесь просто заставить его сказать:

sidekiq:
  image: production_image
  command: bundle exec sidekiq

Поскольку вы в любом случае смотрите на AWS, вам также следует рассмотреть возможность использования размещенных сервисов для хранения данных (RDS для базы данных, Elasticache для Redis).Важно включить расположение этих хранилищ данных в качестве переменных среды, чтобы вы могли изменить их позже (возможно, они будут иметь значение по умолчанию localhost для использования разработчиком, но всегда будут отличаться при развертывании).

Вы также заметите, что мои примеры не имеют links:.Docker предоставляет внутреннюю службу DNS для контейнеров, чтобы найти друг друга, а Docker Compose организует поиск контейнеров через их служебный ключ в файле YAML.

Наконец, вы должны иметь возможность проверить эту настройку локально перед развертываниемэто к EC2.Запустите docker build и docker-compose up при необходимости;отладки;и если он работает, то docker push изображений и запустите его на Amazon.

version: '3'
volumes: *volumes_from_the_question
services:
  db: *db_from_the_question
  redis: *redis_from_the_question

  sidekiq:
    image: 123456789012.dkr.ecr.us-east-1.amazonaws.com/myapp/sidekiq:1.0
    environment:
      - PGHOST: db
      - REDIS_HOST: redis

  app:
    image: 123456789012.dkr.ecr.us-east-1.amazonaws.com/myapp/app:1.0
    ports:
      - "80:80"
    environment:
      - PGHOST: db
      - REDIS_HOST: redis
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...