Tải lại nóng không hoạt động với webpack-dev-server và docker


10

Sử dụng Ubuntu Linux với docker được cài đặt. Không có VM.

Tôi đã xây dựng một hình ảnh docker với một ứng dụng vuejs. Để kích hoạt tải lại nóng, tôi khởi động container docker bằng:

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

Nó khởi động tốt và tôi có thể truy cập nó từ trình duyệt máy chủ của mình trên đó localhost:8081. Nhưng khi tôi thực hiện thay đổi cho các tệp nguồn và lưu những thay đổi đó, chúng không được phản ánh trong trình duyệt của tôi trước khi tôi nhấn F5 (tải lại nóng không hoạt động).

Một số chi tiết dưới đây:

pack.json

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

xây dựng / 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

    }

Đã cố gắng sửa đổi watchOptions nhưng nó không có hiệu lực.

BIÊN TẬP:

Dựa trên câu trả lời dưới đây, tôi đã cố gắng vượt qua: CHOKIDAR_USEPOLLING=truenhư một biến môi trường để chạy docker:

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

Nhưng nó không có hiệu lực - vẫn không thể tải lại các thay đổi của tôi. Cũng trong liên kết được cung cấp, nó nói:

Cập nhật / Làm rõ: Sự cố này chỉ xảy ra khi chạy công cụ Docker của bạn bên trong máy ảo. Nếu bạn đang dùng Linux cho cả Docker và mã hóa thì bạn không gặp vấn đề này.

Vì vậy, đừng nghĩ câu trả lời áp dụng cho thiết lập của tôi - Tôi đang chạy Ubuntu Linux trên máy của mình, nơi tôi đã cài đặt docker. Vì vậy, không có thiết lập VM.

Một cập nhật khác - dựa trên nhận xét bên dưới về việc thay đổi ánh xạ cổng:

  # 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

Vì vậy, nếu tôi port map sang 8080:8080thay vì 8081:8080tải lại hoạt động! Lưu ý rằng ứng dụng xuất hiện trong cả hai trường hợp khi tôi truy cập nó trên trình duyệt máy chủ của mình localhosttrên các cổng được đề cập trước đó. Nó chỉ tải lại nóng chỉ hoạt động khi tôi ánh xạ ứng dụng tới 8080 trên máy chủ của mình.

Nhưng tại sao??

Bây giờ nếu tôi làm:

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

Tải lại nóng tất nhiên hoạt động. Nhưng vẫn không chắc chắn lý do tại sao tôi không thể ánh xạ cổng container bên trong 8080 đến 8081 bên ngoài máy chủ.

Btw; Tôi không thấy vấn đề gì cả nếu tôi sử dụng vue-cli-service servethay vì - mọi thứ hoạt động ra khỏi hộp .


Đây có phải là làm việc theo VM?
Gauravsa

Ý bạn là gì khi mô tả ứng dụng đang chạy bên trong một container docker.
u123

Có thể thay đổi định nghĩa cổng của bạn thành-p 8080:8080 -p 8081:8081
George

Hà chỉ định 'docker run -it -p 8080: 8080 -e "HOST = 0.0.0.0" -v $ {PWD}: / app / -v / app / node_modules - đặt tên cho my-frontend my-frontend-image' hoạt động ! Vì vậy, ứng dụng cần phải được ánh xạ tới 8080 để tải lại nóng để hoạt động. Nhưng tại sao??
u123

Câu trả lời:


2

Tôi hoàn toàn không phải là người dùng VueJS, chưa bao giờ làm việc với nó, nhưng tôi sử dụng Docker rất nhiều cho quy trình phát triển của mình và trong quá khứ tôi đã gặp phải một vấn đề tương tự.

Trong trường hợp của tôi, Javascript được gửi tới trình duyệt đã cố gắng kết nối với cổng bên trong của bộ chứa docker 8080, nhưng một khi đã ánh xạ một cái cho máy chủ lưu trữ 8081, thì JS trong trình duyệt không thể truy cập 8080vào bên trong bộ chứa docker tải lại nóng không hoạt động.

Vì vậy, dường như với tôi rằng bạn có cùng kịch bản với tôi, do đó bạn cần định cấu hình trong ứng dụng VueJS của mình, tải lại nóng để nghe trong cùng một cổng bạn muốn sử dụng trong máy chủ hoặc chỉ sử dụng cùng một cổng cho cả hai như bạn đã kết luận rằng nó hoạt động.


Vâng, có vẻ như nó. Có thể thú vị với một lời giải thích mặc dù - vì ngay bây giờ tôi cần nhớ áp dụng cách giải quyết của mình như mô tả. Ngoài ra, như tôi đã mô tả, nó hoạt động vượt trội nếu tôi sử dụng 'vue-cli-service phục vụ' thay vào đó phải là thứ gì đó bị hỏng trong 'webpack-dev-server'.
u123

Không có gì bị hỏng trong 'webpack-dev-server', bạn chỉ cần hiểu cách Docker hoạt động. Docker giống như một hộp đen để tải lại trực tiếp. Đối với tất cả vấn đề nó nói chuyện với localhost, không phải docker.
Exadra37

-1

Nếu watchOptions không hoạt động, bạn có thể thử tùy chọn khác:

 environment:

  - CHOKIDAR_USEPOLLING=true

Theo tài liệu ở đây:

Nếu xem không hiệu quả với bạn, hãy thử tùy chọn này. Xem không hoạt động với NFS và máy trong VirtualBox.

Tài liệu tham khảo:

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


Không chắc chắn về nơi chỉ định những gì bạn đề xuất nhưng theo tôi hiểu thì nó cần được đặt làm biến môi trường. Nếu tôi làm điều đó để docker chạy nó không có hiệu lực. Xem bài viết cập nhật của tôi. Ngoài ra trong liên kết bạn cung cấp, nó nói rằng điều này chỉ có liên quan khi chạy trong VM.
u123
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.