Python社区  »  docker

Rails 5+、WebPacker和Docker开发工作流

Roman Pushkin • 5 月前 • 95 次点击  

使用Docker的优势之一是整个团队的单一环境。前一段时间,我使用Vagrant将开发环境统一到一个团队中,它运行得很好。我们的工作流程如下:

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

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

有些人使用Docker进行类似的开发工作流程,但我通常使用 docker-compose 只是为了运行卫星服务。而我是 总是 在主机操作系统中运行Rails monolith,就像本机一样。

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

  • 所有的卫星服务都在码头集装箱内,我只有一堆暴露的港口。我不需要brew安装很多软件来支持它们,这很好。

  • Rails monolith运行在主机操作系统中,所以每次我制作时, JavaScript 文件更改,WebPacker开始运行,重建并应用更改 不刷新页面 . 需要强调的是,因为页面刷新需要时间,所以我不想每次进行JavaScript或CSS文件更改时都刷新页面。

对于流浪汉来说,上述方案也很有效。但与Docker不同的是。

有些人在Docker中使用的开发工作流如下:

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

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

换言之,采用Docker-only方法,我们有以下缺点:

  • 没有webpacker js/css刷新
  • 容器重建,这需要时间
  • 应用程序重启,有时需要很多时间,甚至零代码的“Rails”应用程序在~3秒内启动

所以我的问题是:用Docker-only方法最好的方法是什么?如何在使用带有Rails的WebPacker时利用Docker,避免页面刷新和应用程序重启?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/52859
 
95 次点击  
分享到微博
文章 [ 1 ]  |  最新文章 5 月前
David Basalla
Reply   •   1 楼
David Basalla    8 月前

我最近一直在读一本关于这个的好书( 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: