【问题标题】:How to configure webpack hot reload to work inside Docker?如何配置 webpack 热重载以在 Docker 中工作?
【发布时间】:2021-11-07 05:54:04
【问题描述】:

我在 Symfony 4 项目上工作了几个月,我想将它 Dockerize。

除了 Webpack,我让所有东西都能正常工作,我用它来编译我的 .scss.js 文件,使用 npm run watchnpm run dev 命令。

实际上 webpack 不会监听我在 .scss.js 文件中所做的更改。

这是我的配置,我肯定错过了我的文件中的某些内容。

我的docker-compose.yml

version: '3.8'
services:
  mysql:
     image: mysql:8.0
     command: --default-authentication-plugin=mysql_native_password
     restart: on-failure
     environment:
       MYSQL_ROOT_PASSWORD: rootpassword
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    restart: on-failure
    depends_on:
      - mysql
    ports:
      - '8004:80'
    environment:
      PMA_HOSTS: mysql
  php:
    build:
      context: .
      dockerfile: php/Dockerfile
    volumes:
      - '../.:/usr/src/app'
    restart: on-failure
    env_file:
      - .env
  nginx:
    image: nginx:1.19.0-alpine
    restart: on-failure
    volumes:
      - '../public:/usr/src/app'
      - './nginx/default.conf:/etc/nginx/conf.d/default.conf:ro'
    ports:
      - '80:80'
    depends_on:
      - php
  node:
    build:
      context: .
      dockerfile: node/Dockerfile
    volumes:
       - '../.:/usr/src/app'
    command: npm run watch

我的Dockerfile 用于节点图像:

FROM node:12.10.0

RUN apt-get update && \
    apt-get install -y \
        curl

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
        echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

WORKDIR /usr/src/app

CMD ["npm", "run", "watch"]

我的webpack.config.js

var Encore = require('@symfony/webpack-encore');
var CopyWebpackPlugin = require('copy-webpack-plugin');

if (!Encore.isRuntimeEnvironmentConfigured()) {
    Encore.configureRuntimeEnvironment(process.env.NODE_ENV || 'dev');
}

Encore
    .setOutputPath('public/build/')
    .setPublicPath('/build')

    .addEntry('app', './assets/js/app.js')

    .splitEntryChunks()

    .disableSingleRuntimeChunk()

    .enableSassLoader()

    .cleanupOutputBeforeBuild()
    
    .enableBuildNotifications()
    
    .enableSourceMaps(!Encore.isProduction())
    .enableVersioning(Encore.isProduction())

    .configureBabel(() => {}, {
        useBuiltIns: 'usage',
        corejs: 3
    })

    .addPlugin(new CopyWebpackPlugin([
        { from: './assets/pictures', to: 'pictures' }
    ]))
;

module.exports = Encore.getWebpackConfig();

// module.exports = {
//   mode: 'development',
//   devServer: {
//     port: 80,
//     host: '0.0.0.0',
//     disableHostCheck: true,
//     watchOptions: {
//       ignored: /node_modules/,
//       poll: 1000,
//       aggregateTimeout: 1000
//     }
//   }
// }

如你所见,我已经在webpack.config.js 中尝试了一些东西,我看到了很多关于watchOptions 的东西,但我没有明白。

这是我的项目组织:

project's organisation

我希望能够使用 Webpack 启动我的 Docker,实时监听我所做的任何更改。

这是运行docker-compose up后的命令控制台:

console command docker-compose up

如果您有一些改进我的 Docker 环境的建议,我会全力以赴!

谢谢!

【问题讨论】:

  • 如果您使用 WSL2 运行 Windows,如果文件存储在 Windows 文件系统中,则不会将文件更改事件发送到容器。文档说“如果原始文件存储在 Linux 文件系统中,Linux 容器只会接收文件更改事件(“inotify 事件”)。例如,一些 Web 开发工作流依赖 inotify 事件在文件更改时自动重新加载。 docs.docker.com/desktop/windows/wsl
  • 您好@HansKilian,是的,我忘了说,我在带有 Docker 桌面应用程序的 Windows 10 上运行。是的,我使用 WSL2。我的项目存储在我的主磁盘上,但我想我没有得到你的所有解释。我必须检查这个“inotify events”才能完成这项工作?我是 Docker 的初学者:/
  • 这更详细地说明了它为什么不起作用以及如何解决它。就我个人而言,我认为将我的文件存储在 WSL 文件系统中太麻烦了,我放弃了让它工作。 levelup.gitconnected.com/…

标签: node.js docker symfony npm webpack


【解决方案1】:

好的,我想我解决了我的问题,

我关注了@Rufinus 的回答;我必须在第一个控制台命令中使用docker-compose up,打开第二个控制台命令并执行winpty docker-compose exec node yarn watch,但由于某种原因我遇到了node-sass 兼容性问题:我将我的node_module(Windows 10)文件夹安装到容器(Linux)中.

所以我打开了我的节点 CLI 容器并执行 npm rebuild node-sass 来解决这个问题,终于成功了!

但我不知道为什么,我当前的解决方案是在我的本地文件夹上执行 npm run watch(就像我在 Dockerizing 我的所有应用程序之前这样做)并且当我更改 .scss.js 文件。

【讨论】:

  • 我在这里发表评论 - 但也包括您对我的回答的评论。首先,没有我只在 linux 上编码——所以有了 win,有些事情可能会有所不同。第二 - 在每次更改 docker-compose.yml 之后,您必须执行 docker-compose up -d。我的节点容器配置只是一个悬挂的容器。并等待要做的事情。我的 wepack js 大多是默认的。 (symfony/webpack)。
  • docker-compose up -d 之后我的正常工作流程是安装 npm/yarn pkg,然后启动 watcher。这在自己的控制台窗口中运行 - 所以我看看是否有任何错误 - 如果某些东西不起作用,它更容易按 ctrl+c 并重新开始。
【解决方案2】:

我只是用这个:

docker-compose.yml:

node:
    image: node:16-alpine3.13
    working_dir: /var/www/app
    user: "$USERID"
    volumes:
        - .:/var/www/app
    tty: true

docker-compose exec node yarn watch

按预期工作。

【讨论】:

  • 你好@Rufinus,谢谢你的回答,我用你的回答改变了我的 docker-compose.yml 但是我什么时候启动这个命令?这个命令是替换 docker-compose up 还是我打开另一个控制台命令并在我的容器启动时执行它?你也在 Windows 10 上吗?您是否在 webpack.config.js 文件中配置了更多内容?其实我有点失落
猜你喜欢
  • 1970-01-01
  • 2020-11-16
  • 2021-01-08
  • 2016-08-13
  • 2019-07-01
  • 1970-01-01
  • 2021-01-25
  • 2017-07-15
  • 2020-08-17
相关资源
最近更新 更多