ホットリロードがwebpack-dev-serverおよびdockerで機能しない


10

dockerがインストールされたUbuntu Linuxを使用します。VMなし。

私はvuejsアプリケーションでDockerイメージをビルドしました。ホットリロードを有効にするには、次のコマンドでdockerコンテナーを起動します。

docker run -it -p 8081:8080 -e "HOST=0.0.0.0" -v ${PWD}:/app/ -v /app/node_modules --name my-frontend my-frontend-image

正常に起動し、のホストブラウザからアクセスできますlocalhost:8081。しかし、ソースファイルに変更を加えて保存すると、F5キーを押す前にブラウザに反映されません(ホットリロードが機能しません)。

以下の詳細:

package.json

  "scripts": {
    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
    "start": "npm run dev",

build / webpack.dev.conf.js

  devServer: {
    clientLogLevel: 'warning',
    ...
    hot: true,
    ...
    watchOptions: {
      //poll: config.dev.poll,
      //aggregateTimeout: 500, // delay before reloading
      poll: 100 // enable polling since fsevents are not supported in docker

    }

watchOptionsを変更しようとしましたが、効果がありません。

編集:

以下の答えに基づいて、私は渡そうとしました:CHOKIDAR_USEPOLLING=truedocker runの環境変数として:

docker run -it -p 8081:8080 -e "HOST=0.0.0.0" -e "CHOKIDAR_USEPOLLING=true" -v ${PWD}:/app/ -v /app/node_modules --name my-frontend my-frontend-image

しかし、それは効果がありません-それでも私の変更をホットリロードできません。また、提供されたリンクには次のように書かれています:

更新/説明:この問題は、DockerエンジンをVM内で実行している場合にのみ発生します。Dockerとコーディングの両方でLinuxを使用している場合、この問題は発生しません。

だから答えが私のセットアップに当てはまるとは思わない-私はドッカーをインストールした私のマシンでUbuntu Linuxを実行しています。したがって、VMセットアップはありません。

別の更新 -ポートマッピングの変更に関する以下のコメントに基づく:

  # Hot reload works!
  docker run -it -p 8080:8080 -e "HOST=0.0.0.0" -v ${PWD}:/app/ -v /app/node_modules --name my-frontend my-frontend-image

  # Hot reload fails!  
  #docker run -it -p 8081:8080 -e "HOST=0.0.0.0" -v ${PWD}:/app/ -v /app/node_modules --name my-frontend my-frontend-image

だから8080:80808081:8080ホットリロードの代わりにマップを移植するとうまくいきます!localhost前述のポートのホストブラウザーでアクセスすると、どちらの場合でもアプリケーションが表示されます。そのホットリロードは、ホスト上のアプリケーションを8080にマップしたときにのみ機能します。

しかし、なぜ??

今私がするなら:

PORT='8081'
docker run -it -p "${PORT}:${PORT}" -e "HOST=0.0.0.0" -e "PORT=${PORT}" -v ${PWD}:/app/ -v /app/node_modules --name my-frontend my-frontend-image

もちろんホットリロードは機能します。しかし、なぜホストの内部コンテナーポート8080を外部で8081にマップできないのかはまだわかりません。

ところで; vue-cli-service serve代わりに使用しても問題はまったくわかりません。すべてがそのまま機能します


これはVMで動作していますか?
Gauravsa

説明されているように、アプリはdockerコンテナー内で実行されています。
u123

ポートの定義を次のように変更できます-p 8080:8080 -p 8081:8081
George

「docker run -it -p 8080:8080 -e "HOST = 0.0.0.0" -v $ {PWD}:/ app / -v / app / node_modules --name my-frontend my-frontend-image」が指定されている!したがって、ホットリロードが機能するためには、アプリケーションがポート8080にマップされている必要があります。しかし、なぜ??
u123

回答:


2

私はVueJSのユーザーではありません。使用したことはありませんが、開発ワークフローにDockerを多用しており、以前に同様の問題が発生しました。

私の場合、ブラウザに送信されたJavascriptがDockerコンテナの内部ポートに接続しようとして8080いましたが、いったんホスト用にマッピングされたものが8081になると、ブラウザのJS 8080はDockerコンテナの内部に到達できなかったため、ホットリロードが機能していませんでした。

だからあなたは私と同じシナリオを持っているようです、したがって、ホストで使用したいのと同じポートでリッスンするようにVueJSアプリでホットリロードを構成するか、両方に同じポートを使用する必要がありますそれはうまくいくとすでに結論付けました。


そうですね。しかし、説明があれば興味深いかもしれません-現時点では、説明した回避策を適用することを忘れないようにする必要があります。また、先に述べたように、代わりに「vue-cli-service serve」を使用する場合、そのままで機能するため、生の「webpack-dev-server」で壊れているものでなければなりません。
u123

「webpack-dev-server」では何も壊れていません。Dockerがどのように機能するかを理解する必要があります。Dockerは、ライブリロードのブラックボックスのようなものです。何よりも、Dockerではなくlocalhostとの通信が重要です。
Exadra37

-1

watchOptionsが機能しない場合は、他のオプションを試すことができます。

 environment:

  - CHOKIDAR_USEPOLLING=true

ここのドキュメントによると:

「視聴がうまくいかない場合は、このオプションをお試しください。監視は、VirtualBoxのNFSおよびマシンでは機能しません。」

参照:

https://daten-und-bass.io/blog/enabling-hot-reloading-with-vuejs-and-vue-cli-in-docker/


あなたが提案することをどこに指定するかはわかりませんが、私が理解しているように、環境変数として設定する必要があります。docker runでそれを行っても効果はありません。私の更新された投稿を参照してください。また、あなたが提供するリンクでは、これはVMで実行されている場合にのみ関係があると述べています。
u123
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.