Webpacker hot-reload (HRM) in Docker
#rails #docker
I was trying to get the HRM working in the docker environment today. What I forgot is how the webpacker try to resolv the webpacker server, which is not obvious in non-docker environment. Few of the points that I learned:
- Webpacker host and port configurations are important in both
docker-compose.ymlas well as inwebpacker.yml. Websocket is initialised with these values. - It is better to have a separate image that runs the
bin/webpack-dev-server - Compile on demand is way too slow for development if your files are huge, or even medium sized.
publicandhostconfiguration indev_serverinwebpacker.ymlare two different things.- There is some issue with the docker already containing the compiled files in the output directory (typically in
public/packs).
This was the final configuration that I had to get it up and running:
docker-compse.yml
services:
webpacker:
build: .
command: bash -c "rm -rf /myapp/public/packs; /myapp/bin/webpack-dev-server"
volumes:
- .:/myapp
ports:
- "3035:3035"
db:
image: postgres:9.6
ports:
- "5432"
app:
build: .
command: bash -c "rm /myapp/tmp/pids/server.pid; bundle exec rails server -p 3000 -b '0.0.0.0'"
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- webpacker
- postgresdev_server section in webpacker.yml
dev_server:
https: false
host: webpacker # <-- this is the key
port: 3035
public: 0.0.0.0:3035
hmr: true
# Inline should be set to true if using HMR
inline: true
overlay: true
disable_host_check: true
use_local_ip: falseA docker-compose up will start the web server along with the webpacker sever that will watch for change and pass it via a websocket to the frontend which will get automatically reloaded after the diff got compiled.
Very fast!