如何使用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运行该容器和其他容器来创建服务器环境之前创建应用程序容器。

+0

感谢您的信息。 Docker-compose可以帮助您运行Dockerfile并生成容器。 Docker和Capistrano有不同的目的。 如果我可以将docker-compose配置为在多个文件夹中运行时更新相同的容器,它会OKAY。 – NamLe

请参考docker-compose cliCompose 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,并且您不希望在产品容器中安装代码或运行此设置以生产产品...