Featured image of post Dockerコンテナで構築したNuxt 3製Webアプリでホットリロードが効かないときの対処法

Dockerコンテナで構築したNuxt 3製Webアプリでホットリロードが効かないときの対処法

これはなに Link to this heading

Docker Desktop for WindowsNuxt.jsを用いてWebアプリケーションを作成した際に、ホットリロードが効かなかった際の対処法を残す。

環境 Link to this heading

  • Windows 11
  • Docker Desktop for Windows v4.19.0
  • Nuxt.js 3.4.3
  • Node.js v19.9.0
  • npm 9.6.3

どうやらDocker Desktop for Windowsを利用してホストマシン(Windows)でNuxtアプリケーションを実行すると発生する問題のようだ。ホストマシンがWindowsでも、WSL2内でDockerコンテナを立てWSL2内のコンテナから実行する場合は、ホットリロードが効かない問題は発生していない。

忙しい人のための結論 Link to this heading

まず、24678番のポートをポートフォワーディングする。 たとえば、docker runの際に-p 24678:24678のオプションを追加すればよい。

次に、nuxt.config.tsに以下の記述を追加する。

nuxt.config.ts
export default defineNuxtConfig({
  vite: {
    server: {
      watch: {
        usePolling: true,
      },
    },
  },
})

これでホットリロードが効くようになる。

ホットリロードとは Link to this heading

ホットリロードとは、コードを変更したときに自動的に反映してくれる機能のことである。コードを書いている最中に、ブラウザの画面が自動的に更新されるので、変更内容をすぐに確認できる。

ホットリロードが効かない問題を再現する最小限の手順 Link to this heading

まず、Nuxt.jsでWebアプリケーションを開発するための環境をDocker Desktop for Windowsで構築する。以下のDockerfileをつくる。

Dockerfile
FROM node:19-bullseye-slim

USER node
WORKDIR /home/node

EXPOSE 3000

作ったDockerfileをビルドする。

docker build -t test-nuxt .

ビルドしたイメージを用いてコンテナを立ち上げる。

docker run --name test-nuxt-app -it --rm -p 3000:3000 -v ${pwd}:/home/node test-nuxt /bin/bash

次に、Nuxt.jsのWebアプリケーションを生成し起動する。

コンテナ内で実行する
cd ~/
npx nuxi init my-nuxt-app
cd my-nuxt-app
npm install
npm run dev

この時点で、ソースコードを変更し、ホットリロードが効くか確認する。ソースコードの変更がリアルタイムで反映されない場合、ホットリロードが機能していないとわかる。

解決法 Link to this heading

まず、24678番のポートをポートフォワーディングする。Nuxt3では、ホットリロード用に24678ポートで接続を待ち受けるためである。 ポートフォワーディングは、たとえば、docker runの際に-p 24678:24678のオプションを追加すればよい。Docker Composeを利用しているなら、portsに24678:24678を追加する1

docker run --name test-nuxt-app -it --rm -p 3000:3000 24678:24678 -v ${pwd}:/home/node test-nuxt /bin/bash

次に、nuxt.config.tsに以下の記述を追加する。

nuxt.config.ts
export default defineNuxtConfig({
  vite: {
    server: {
      watch: {
        usePolling: true,
      },
    },
  },
})

このコードにより、ホットリロードが有効化され、ソースコードの変更がリアルタイムで反映されるようになる。

手順が正しく行われ、ホットリロードが有効になったかを確認するには、npm run devでアプリケーションを起動し、ソースコードを変更してみれば良い。ソースコードを変更すると、その変更がリアルタイムで反映され、手動でリロードすることなくアプリケーションの挙動を確認できる。

参考文献・URL Link to this heading


  1. ついでに、DockerfileにEXPOSE 24678を書いておくと親切である。 ↩︎

Licensed under CC BY-NC-SA 4.0
最終更新 2月 03, 2024
Hugo で構築されています。
テーマ StackJimmy によって設計されています。