使用docker时避免双包安装

时间:2016-05-08 18:38:03

标签: ruby-on-rails docker docker-compose

我使用docker作为我的rails应用程序的环境,使用以下docker-compose.yml

app:
  build: .
  ports:
    - "3000:3000"
  links:
    - db
    - mail
  volumes:
    - .:/usr/src/app
    - gemrc:/etc/gemrc
db:
  image: mdillon/postgis
  ports:
    - "5432:5432"
  environment:
    - POSTGRES_USER=user
    - POSTGRES_PASSWORD=password
    - POSTGRES_DB=database
  volumes:
    - ./docker/pgdata:/var/lib/postgresql/data
mail:
  image: djfarrelly/maildev
  ports:
    - "1080:80"

我的Dockerfile

FROM rails:onbuild

当我需要为我的Gemfile添加一个新的gem时,我必须首先生成我的Gemfile.lock

docker run --rm -v gemrc:/etc/gemrc -v /home/user/project:/usr/src/app -w /usr/src/app ruby bundle install

重建码头图像:

docker-compose build
docker-compose up

因此,我必须运行bundle install两次,而无法添加--without development test标志。为了更快地将其添加到我的gemrc文件中:

gem: --no-document 

有没有办法避免双bundle install

1 个答案:

答案 0 :(得分:1)

也许您可能想为开发环境尝试以下docker-compose工作流程。

  1. 与database.yml类似,我们的docker-compose.yml未包含在我们的CVS(git)中,为开发人员自定义配置提供了类似的好处。

  2. 在启动应用容器之前在本地构建映像,并将其标记为 foo_app:latest 。这是有道理的,因为你是开发者。只需在您应用的根目录中执行docker build .,假设 Dockefile 位于该目录中。

  3. 为捆绑包定义数据卷容器,并将其挂载到您的应用容器中。您的docker-compose.yml可能类似于:

  4. app:
      image: foo_app
      ports:
        - "3000:3000"
      links:
        - db
        - mail
      volumes:
        - .:/usr/src/app
      volumes_from:
        - bundle
    
    bundle:
      image: foo_app:latest
      volumes:
        - /home/app/bundle
    
    db:
      image: mdillon/postgis
      ports:
        - "5432:5432"
      environment:
        - POSTGRES_USER=user
        - POSTGRES_PASSWORD=password
        - POSTGRES_DB=database
      volumes:
        - ./docker/pgdata:/var/lib/postgresql/data
    mail:
      image: djfarrelly/maildev
      ports:
        - "1080:80"
    
    1. 每次需要添加新gem时,只需将其添加到Gemfile并在app容器中执行bundle install即可。例如,如果您的应用容器的名称是 foo_app_1

      docker exec foo_app_1 bundle install

      数据卷容器将始终包含应用程序宝石的最新/边缘快照

    2. 标记您的版本并构建"官方发布图像"在您的登台/制作/团队可访问的中央存储库中。

    3. 每次启动/重新创建应用容器时都会采用这种方法,所有的宝石都与上次更新时一样。您还可以将此方法用于您希望在容器生命周期中持久化的其他类型的数据,添加"组件"管理无状态应用程序中的状态。

      有关详细信息,请参阅https://docs.docker.com/engine/userguide/containers/dockervolumes/