Главное

  • для webpacker создаем отдельный docker сервис, но используем один образ
  • host - имя контейнера где работает webpacker, Rails будет работать (компилировать) с этим адресом
  • публичный хост - localhost, при HMR будет опрашивать localhost:3035
  • разрешить политику подключения  policy.connect_src для HMR
  • указываем в настройках hmr: true и hot: true

Кофигурация Webpacker

# config/webpacker.yml
development:
  <<: *default
  host: webpacker
  hmr: true
  compile: true

dev_server:
  https: false
  # set same as docker-compose service name
  host: webpacker
  port: 3035
  # for proxy packs
  public: localhost:3035
  hmr: true
  host: true
  inline: true
  compress: true
  disable_host_check: true
  use_local_ip: false
  quiet: false
  headers:
    'Access-Control-Allow-Origin': '*'
  watch_options:
    ignored: '**/node_modules/**'
  

Политики

# config/initializers/content_security_policy.rb

Rails.application.config.content_security_policy do |policy|
  policy.connect_src :self, :https, "http://localhost:3035", "ws://localhost:3035" if Rails.env.development?
end

Дополнительный сервис в docker-compose

# docker-compose.yml
# only part

services:
  app:
    build: .
    command: bundle exec rails s -b '0.0.0.0'
    # shared image for two services 
    image: username/railsproject:6.0.0
    ports:
      - 3000:3000
    volumes:
      - .:/usr/src/app
    env_file:
      - .env
      - .env.development
      - .env.webpacker
    ...
  webpacker:
    image: username/railsproject:6.0.0
    depends_on:
      - app
    env_file:
      - .env.webpacker
    command: ./bin/webpack-dev-server
    volumes:
      - .:/usr/src/app
    ports:
      - 3035:3035
    ...