laravel - HMR 不适用于 Docker 中的 Laravel Mix

标签 laravel docker docker-compose webpack-dev-server laravel-mix

我在 Docker 容器内的 Laravel Mix 中设置热模块重新加载时遇到一些问题。

我有以下 Dockerfile:

FROM php:7.4.0-fpm

RUN curl -sL https://deb.nodesource.com/setup_13.x | bash

RUN apt-get update && \
    apt-get install -y -q --no-install-recommends \
    nano apt-utils curl unzip default-mysql-client nodejs build-essential git \
    libcurl4-gnutls-dev libmcrypt-dev libmagickwand-dev \
    libwebp-dev libjpeg-dev libpng-dev libxpm-dev \
    libfreetype6-dev libaio-dev zlib1g-dev libzip-dev && \
    echo 'umask 002' >> /root/.bashrc  && \
    apt-get clean

# Docker PHP Extensions
RUN docker-php-ext-install -j$(nproc) iconv gettext gd mysqli curl pdo pdo_mysql zip && \
    docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ && \
    docker-php-ext-configure curl --with-curl

WORKDIR /var/www/html

COPY . /var/www/html

EXPOSE 80

我正在使用下面的 docker-compose.yml 文件构建它。
  # The Application
  app:
    build:
      context: ./
      dockerfile: app.dockerfile
    working_dir: /var/www/html
    volumes:
      - ./webroot:/var/www/html
    environment:
      - "DB_PORT=3306"
      - "DB_HOST=database"
      - CHOKIDAR_USEPOLLING=true

  # The Web Server
  web:
    build:
      context: ./
      dockerfile: web.dockerfile
    working_dir: /var/www/html
    volumes_from:
      - app
    ports:
      - 80:80

在以前的 Node.js 应用程序中,我复制了 dockerfile 中的数据,并将卷挂载到 compose 文件中,但这似乎与 Laravel 没有相同的效果。

我在 Git Bash 中看到以下输出,但是在我在容器内运行 npm run hot 后,网页根本没有重新加载更改,即使手动刷新也没有:

enter image description here

尽管如此,我之前使用过的 npm run watch-poll 仍然可以按预期工作。

通常,在查看应用程序时,我会在浏览器内的 HMR 和 WDS 的控制台中看到日志。但是在这种情况下,我没有看到任何输出。

下面我还包含了我的 webpack.mix.js 文件。我一直在搞乱一些选项,例如端口和主机,因为我知道在容器内运行时需要以某种方式配置它们。任何帮助将不胜感激,因为我正在努力找出我哪里出错了。
mix.options({
    hmrOptions: {
        host: 'localhost',
        port: '80'
    },
});

mix.webpackConfig({
    mode: "development",
    devtool: "inline-source-map",
    devServer: {
        disableHostCheck: true,
        headers: {
            'Access-Control-Allow-Origin': '*'
        },
        host: "0.0.0.0",
        port: 80
    },
});

编辑:

将两个主机值都设置为 web 后运行 npm run hot 时的错误输出:
> @ hot /var/www/html
> cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js

events.js:298
      throw er; // Unhandled 'error' event
      ^

Error: listen EADDRNOTAVAIL: address not available 172.25.0.4:80
    at Server.setupListenHandle [as _listen2] (net.js:1292:21)
    at listenInCluster (net.js:1357:12)
    at GetAddrInfoReqWrap.doListen [as callback] (net.js:1496:7)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:69:10)
Emitted 'error' event on Server instance at:
    at emitErrorNT (net.js:1336:8)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  code: 'EADDRNOTAVAIL',
  errno: -99,
  syscall: 'listen',
  address: '172.25.0.4',
  port: 80
}

最佳答案

问题出在

mix.options({
    hmrOptions: {
        host: 'localhost',
        port: '80'
    },
});

您不能使用 localhost,因为在这种情况下它是指您的 APP 容器,您应该使用 web相反,因为 compose 将为您解析服务名称:
mix.options({
    hmrOptions: {
        host: 'web',
        port: '80'
    },
});

mix.webpackConfig({
    mode: "development",
    devtool: "inline-source-map",
    devServer: {
        disableHostCheck: true,
        headers: {
            'Access-Control-Allow-Origin': '*'
        },
        host: "web",
        port: 80
    },
});

关于laravel - HMR 不适用于 Docker 中的 Laravel Mix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60267299/

相关文章:

go - `docker-compose up` 与 UnixHTTPConnectionPool 超时

php - Laravel 邮件::队列和主管

docker - 推送后如何使用 BitBucket Pipelines 更新 Google Cloud Compute Engine 实例?

c# - 在哪里可以找到 Azure 应用服务的 docker 容器日志

docker - 在 perl6 中 sleep 在 docker-compose 上无法正常工作

docker - 无法在docker-compose中使用变量替换

docker - Docker,悬挂容器?

php - Laravel 5.2 中的 API 限制

php - Laravel - 迁移,表结构修改 - 正确方法

php - Laravel PDO 设置?