【问题标题】:Cannot run webpack-dev-server inside docker无法在 docker 内运行 webpack-dev-server
【发布时间】:2016-09-22 06:45:12
【问题描述】:

我创建了一个 docker 映像,它使用容器内部的 webpack 为一个简单的 react 应用程序提供服务,但我在浏览器中什么也没有。

这是我的配置文件

package.json

{
  "name": "invas_client",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "webpack --inline --content-base ."
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "react": "^0.14.7",
    "react-dom": "^0.14.7",
    "react-router": "^2.0.0"
  },
  "devDependencies": {
    "babel-core": "^6.5.1",
    "babel-loader": "^6.2.2",
    "babel-preset-es2015": "^6.5.0",
    "babel-preset-react": "^6.5.0",
    "http-server": "^0.8.5",
    "webpack": "^1.12.13",
    "webpack-dev-server": "^1.14.1"
  }
}

webpack.config.js

module.exports = {
    entry: './index.js',

    output: {
        filename: 'bundle.js',
        publicPath: ''
    },

    module: {
        loaders: [
            { test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader?presets[]=es2015&presets[]=react' }
        ]
    }
}

Dockerfile

# Use starter image
FROM node:argon

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install

# Bundle app source
COPY . /usr/src/app

# Expose port
EXPOSE 8080

# Default command to run
CMD ["npm", "start"]

什么工作正常

当我运行npm start时,webpack-dev-server运行正常,当我转到http://localhost:8080时,我看到了我的页面。

什么不工作

当我使用 docker 运行我的服务器时,使用以下命令:

docker build -t anubhav756/app . && docker run -p 80:8080 anubhav756/app

日志显示容器内部一切正常,但是当我将浏览器指向http://localhost 时,我得到ERR_CONNECTION_RESET

示例代码结束here

【问题讨论】:

  • 您是在 Linux 上本地运行 Docker,还是在带有 Docker 机器的 VM 中运行?如果是 VM,那么您的容器端口会在 VM 内发布,因此您需要浏览到其 IP 地址 - docker-machine ip
  • @EltonStoneman 在 Linux 上原生
  • 嗯。 iptables -L 的 Docker 链中有什么有趣的事情吗?
  • docker ps 显示:容器 ID 图像命令已创建状态端口名称 c25001e81847 anubhav756/invas_client "npm start" 16 秒前 Up 14 seconds 0.0.0.0:80->8080/tcp beserk_hoover
  • iptables -L 显示:链 DOCKER(3 个引用)目标 prot opt 源目标 ACCEPT tcp -- 任何地方 172.17.0.2 tcp dpt:http-alt Chain DOCKER-ISOLATION(1 个引用)目标 prot opt 源目的地 DROP all -- 任何地方任何地方 DROP all -- 任何地方任何地方 DROP all -- 任何地方任何地方 RETURN all -- 任何地方任何地方

标签: docker webpack webpack-dev-server


【解决方案1】:

您实际上只在本地主机上收听。 要从外部访问,请替换 package.json 文件中的以下行:

"start": "webpack-dev-server --inline --content-base ."

作者:

"start": "webpack-dev-server --host 0.0.0.0 --inline --content-base ."

相关讨论:https://github.com/webpack/webpack-dev-server/issues/147

【讨论】:

  • 谢谢伙计。一下子就解决了!你有一双敏锐的眼睛
  • 如果页面也由服务器提供,这是唯一的解决方案。否则,您将在您的基本域上收到 websocket 请求,这不是您想要的。
【解决方案2】:

如果您无法在容器内启用 webpack-dev-server 的热重载,我只想在 Raphayol 答案中添加一些内容。
即使将我的项目文件夹安装到容器中,我也无法使 webpack 或 webpack-dev-server watch (--watch) 模式工作。
要解决此问题,您需要了解 webpack 如何检测目录中的文件更改。
它使用添加操作系统级别支持以监视文件更改的 2 个软件之一,称为 inotify 和 fsevent。标准 Docker 镜像通常没有预装这些(特别是 Linux 的 inotify),因此您必须将其安装在 Dockerfile 中。
在发行版的包管理器中查找 inotify-tools 包并安装它。幸运的是所有 alpine、debian、centos 都有这个。

【讨论】:

    【解决方案3】:

    当使用带有 Encore 的 webpack-dev-server 并通过 Docker 公开它时,我们需要使用 --host 0.0.0.0 --public localhost:8080 这样即使在浏览器上也可以提供文件 @987654322 @。

    这是我使用的:

    webpack-dev-server --hot --host=0.0.0.0 --public=localhost:8080
    

    【讨论】:

      猜你喜欢
      • 2022-10-01
      • 1970-01-01
      • 2022-06-24
      • 2018-11-26
      • 1970-01-01
      • 2018-04-29
      • 2021-06-24
      • 1970-01-01
      相关资源
      最近更新 更多