我有一个包含此内容的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容器?
答案 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 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