使用Docker开发Rails应用时运行webpack-dev-server的最佳方式是什么?
问题原因
你当前的配置中把rails s放到后台运行,容器的前台主进程是webpack-dev-server,执行docker attach时实际连接的是webpack进程,自然无法接收byebug的交互输入。
推荐解决方案:拆分独立服务
Docker开发场景下推荐遵循单容器单进程原则,把Rails服务和webpack-dev-server拆分为两个独立的compose服务,完全避免进程冲突,改造后的配置如下:
version: '3' services: db: # 保留你原有db服务的配置不变 app: depends_on: - 'db' build: context: . dockerfile: ./docker/app/Dockerfile # 移除后台运行逻辑和webpack相关命令 command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" ports: - '3000:3000' env_file: .env stdin_open: true tty: true # 挂载本地代码实现热更新 volumes: - .:/app # 新增独立的webpack-dev-server服务 webpack_dev_server: build: context: . dockerfile: ./docker/app/Dockerfile command: ./bin/webpack-dev-server ports: - '3035:3035' # webpack-dev-server默认监听端口 env_file: .env volumes: - .:/app depends_on: - app
配套修改
你需要修改Rails项目下config/webpacker.yml的开发环境配置,将dev_server.host的值改为webpack_dev_server(和compose中定义的服务名一致),保证Rails能正确访问到静态资源编译服务。
方案优势
- 两个服务完全独立,执行
docker attach <你的app服务名>即可直接进入Rails交互控制台,byebug调试不受任何影响 - 两个服务的日志分开输出,排查问题更清晰
- 服务启停互不干扰,修改前端代码时不需要重启Rails服务,反之亦然
如果暂时不想拆分服务,也可以用foreman之类的进程管理工具在单容器内管理多进程,但长期来看拆分服务的维护成本更低,也更符合容器化的最佳实践。
内容的提问来源于stack exchange,提问作者Ken Ratanachai S.
相关产品推荐
相关产品推荐

