如何使用Capistrano与Rails和Docker组成?
问题描述:
我正在部署与Capistrano的Rails应用程序。 它通常与Nginx和Passenger没有任何问题。如何使用Capistrano与Rails和Docker组成?
现在,我打算使用docker-compose。
Capfile
# Load DSL and set up stages
require "capistrano/setup"
require "capistrano/deploy"
Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }
deploy.rb
namespace :deploy do
desc "docker compose task"
task docker_compose: :updated do
on roles(:web, :app), in: :groups, limit: 3, wait: 10 do
within release_path do
execute "cd #{release_path} && docker-compose up --build -d"
end
end
end
after 'deploy:updated', 'deploy:docker_compose'
end
泊坞窗,compose.yml
version: '2'
services:
db:
image: mysql/mysql-server:5.7
environment:
- MYSQL_ROOT_PASSWORD=myapp12345
redis:
image: 'redis:3.2-alpine'
command: redis-server
ports:
- '6379:6379'
volumes:
- 'redis:/var/lib/redis/data'
website:
depends_on:
- 'redis'
- 'db'
build: .
image: namle/myapp_api
ports:
- '3001:3000'
volumes:
- '.:/myapp_ruby'
environment:
- REDIS_URL=redis://redis
env_file:
- '.env'
sidekiq:
depends_on:
- 'redis'
- 'db'
build: .
command: bundle exec sidekiq
environment:
- REDIS_URL=redis://redis
volumes:
- '.:/myapp_ruby'
env_file:
- '.env'
nginx-proxy:
image: jwilder/nginx-proxy
container_name: nginx-proxy
ports:
- 80:80
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
volumes:
redis:
website:
sidekiq:
nginx-proxy:
它运行好了。
但我有问题
泊坞窗,撰写将创建新的网络组,卷,图像,集装箱后部署因为release_path
改变。
如何解决?
答
请勿将Capistrano与Docker一起使用。 Capistrano旨在将应用程序重复部署到现有服务器,而Docker旨在将应用程序捆绑到部署的容器中。
我不亲自使用Docker,所以我不能给你说明,但简而言之,你添加一个Dockerfile到你的项目中,运行docker build
(或类似的东西),然后将结果容器部署到你的服务器。
Docker Compose(如果我理解正确)是一种组装一组现有容器的方法。因此,您需要在Docker Compose运行该容器和其他容器来创建服务器环境之前创建应用程序容器。
答
请参考docker-compose cli
Compose docs:
Define and run multi-container applications with Docker.
Usage:
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help
Options:
-f, --file FILE Specify an alternate compose file (default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name (default: directory name)
...
使用-p
标志,以确保项目的名称时,目录名称更改和网络不会被重建不会改变
编辑:假设这是一个非prod env,并且您不希望在产品容器中安装代码或运行此设置以生产产品...
感谢您的信息。 Docker-compose可以帮助您运行Dockerfile并生成容器。 Docker和Capistrano有不同的目的。 如果我可以将docker-compose配置为在多个文件夹中运行时更新相同的容器,它会OKAY。 – NamLe