使用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的方法,我们有以下缺点:
所以我的问题是:仅使用Docker的方法最好的方法是什么?在将WebPacker与Rails结合使用时如何利用Docker并避免页面刷新和应用程序重启?
答案 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: