AWS上的Dockerized Rails应用程序中的Sidekiq

时间:2018-09-12 08:24:10

标签: ruby-on-rails amazon-web-services docker

我有一个包含此内容的docker compose文件。

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失败。我该如何在EC2实例上运行sidekiq而不将我的代码发送到那里,而仅在撰写文件中使用我的代码的docker容器?

1 个答案:

答案 0 :(得分:2)

您需要做的两件事是删除volumes:声明,该声明从本地文件系统中获取实际的应用程序代码,并将构建的Docker映像上载到某个注册表。由于您不在AWS上,因此ECR是一个就绪的选项;公共Docker Hub也可以正常工作。

根据Rails应用程序的结构,在主应用程序和Sidekiq worker中使用相同的图像和不同的命令可能有意义,并且只是说出来即可

sidekiq:
  image: production_image
  command: bundle exec sidekiq

无论如何,由于您一直在查看AWS,因此还应该考虑使用托管服务进行数据存储(数据库的RDS,Redis的Elasticache)的可能性。重要的是将这些数据存储的位置包括为环境变量,以便您以后可以更改它们(也许供开发人员使用它们默认为localhost,但部署时总是有所不同)。

您还将注意到,我的示例中没有links:。 Docker提供了一个内部DNS服务,供容器相互查找,并且Docker Compose安排通过YAML文件中的服务密钥来找到容器。

最后,在将其部署到EC2之前,您应该能够在本地对其进行测试。根据需要运行docker builddocker-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