Rails 5 +,WebPacker和Docker开发工作流程

时间:2019-03-08 00:33:23

标签: ruby-on-rails docker webpacker

使用Docker的优点之一是整个团队的单一环境。前一段时间,我使用Vagrant统一团队中的开发环境,并且效果很好。我们的工作流程是:

  • 运行vagrant up,该命令需要一些时间来下载基本映像,并运行配置脚本。它还将目录从本地文件系统映射到容器文件系统。

  • 更改主机系统上的文件,所有更改都将映射到来宾文件系统(容器),因此无需重新启动容器。

有些人将Docker用于类似的开发工作流程,但我通常仅使用docker-compose来运行卫星服务。而且我一直在主机操作系统中像以前一样在主机操作系统中运行Rails monolith。

所以我的开发工作流程非常标准:

  • 所有附属服务均已启动并位于Docker容器内部,我只有一堆裸露的端口。我不需要大量安装软件来支持它们,这很好。

  • Rails整体运行在主机操作系统上,因此,例如,每当我进行 JavaScript 文件更改时,WebPacker都会起作用,重建并应用更改而无需刷新页面< / strong>。需要强调的是,因为页面刷新需要时间,所以我不想每次更改JavaScript或CSS文件时都刷新页面。

使用Vagrant,上述方案也可以很好地工作。但是与Docker有所不同。

一些人使用Docker的开发工作流程如下:

  • 使用docker-compose命令运行一堆服务,除了Rails monolith(与我上面的开发工作流程相同的步骤)。

  • 每次在应用程序(例如JavaScript文件)中进行更改时,都需要重新构建容器,因为您是在本地文件系统上而不是在Docker容器内部进行更改。因此,您1)停止2)构建3)再次运行Docker容器。

换句话说,使用仅Docker的方法,我们有以下缺点:

  • 没有webpacker js / css刷新
  • 容器重建,这需要时间
  • 重新启动应用程序有时会花费很多时间,即使零代码的“ Rails”应用程序也会在约3秒内启动

所以我的问题是:仅使用Docker的方法最好的方法是什么?在将WebPacker与Rails结合使用时如何利用Docker并避免页面刷新和应用程序重启?

1 个答案:

答案 0 :(得分:1)

最近我一直在读一本不错的书(Docker for Rails developers)。要点似乎是您在Docker容器中运行Rails并使用卷将本地文件“链接”到容器中,以便任何文件更改都将立即生效。这样,您无需重新启动/重建容器。最重要的是,您应该将webpack-dev-server作为一个单独的容器运行(它也需要将本地文件作为卷装入),它将进行JavaScript热重装-因此,无需重新加载页面即可查看JS更新。

您的docker-compose.yml文件如下所示(也使用Redis和Postgres):

version: '3'

services:
  web:
    build: .
    ports: 
      - "3000:3000"
    volumes: 
      - .:/usr/src/app
    env_file:
      - .env/development/web
      - .env/development/database
    environment:
      - WEBPACKER_DEV_SERVER_HOST=webpack_dev_server
  webpack_dev_server:
    build: .
    command: ./bin/webpack-dev-server
    ports:
      - 3035:3035
    volumes:
      - .:/usr/src/app
    env_file:
      - .env/development/web
      - .env/development/database
    environment:
      - WEBPACKER_DEV_SERVER_HOST=0.0.0.0
  redis:
    image: redis
  database:
    image: postgres
    env_file:
      - .env/development/database
    volumes:
      - db_data:/var/lib/postgresql/data
volumes:
  db_data: