【问题标题】:node-babel works very slow in Dockernode-babel 在 Docker 中运行速度很慢
【发布时间】:2016-03-04 10:53:30
【问题描述】:

我已经设置了一个 Docker 容器来开发 node.js 项目。我想使用所有 ES6 特性,所以我使用babel-node 作为转译器,但遇到了一个问题,转译过程在 Docker 中花费了太多时间。

我正在从我的主机安装应用程序目录(因此我可以在 webstorm 中进行编辑),我使用nodemon 跟踪所有更改并自动重新启动服务器。

 docker build -t lazarev/an_app .
 docker run -d -p 49160:8080 --name map -v $HOME/projects/app:/usr/src/app lazarev/an_app tail -f /dev/null

nodemon -l commang 在 shell 脚本中设置,即在我的Dockerfile 中的ENTRYPOINT 中设置。

Dockerfile

FROM node:argon
MAINTAINER Lazarev Alexandr <lazarev@elje-group.com>

RUN mkdir /docker-entrypoint
ADD ./bootstrap.sh /docker-entrypoint

RUN locale -a

EXPOSE 8080

RUN npm install nodemon -g
RUN npm install babel-cli -g

ENTRYPOINT ["/docker-entrypoint/bootstrap.sh"]

bootstarp.sh

 #!/bin/bash
echo "******INSTALL NODE MODULES******"

npm install
date
echo "******RUN THE SERVER******"
nodemon -L
date

packege.json

{
  "name": "app",
  "version": "1.0.0",
  "description": "desc",
  "author": "Lazarev Alexandr <lazarev@elje-group.com>",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "babel-node --presets es2015 --debug server.js"
  },
  "license": "ISC",
  "dependencies": {
    "express": "^4.13.4",
    "mapnik": "^3.5.2",
    "babel-preset-es2015": "^6.6.0"
  }
}

我为什么使用bootstrap.sh 可能看起来很奇怪,但我没有在此处粘贴其他命令。

所以,我的问题是,在我对主机进行一些更改后,nodemon 会立即检测到更改,但服务器重启大约需要半分钟。不通过 babel 编译 ES6 会快很多。

另外,当我在主机上运行相同的项目时(我的主机是 MacbookPro,配备 2.5 GHz Intel Core i7 处理器和 16gb 内存),省略 Docker,一切都足够快。所以我确信问题出在Docker

我的问题是: 为什么 babel-node 在 Docker 容器中转译这么慢?有办法限制吗?

【问题讨论】:

  • Dors docker stats your_containerdocker top 展示什么有趣的东西?您也可以docker exec 然后启动top 或任何其他命令
  • docker stats命令显示编译开始时cpu使用率达到75-99%,内存使用率没有明显变化,在10%左右。
  • 能否将 node_modules 目录挂载为卷?例如:`volumes: - .node_modules_docker:/app/node_modules:delegated`

标签: node.js docker ecmascript-6 babeljs


【解决方案1】:

在 OS X 上运行 Docker 需要使用 Docker Machine。来自Docker OS X docs

由于 Docker 守护程序使用 Linux 特定的内核功能,您 无法在 OS X 中本地运行 Docker。相反,您必须使用 docker-machine 创建并附加到虚拟机 (VM)。这 machine 是一个 Linux VM,它在你的 Mac 上为你托管 Docker。

通过 VM 装载文件,然后将文件装载到正在运行的容器中是。从您的主机上提供文件通常是可以的,但希望这些文件被监视、编译和同步是不行的。

几年前,我在 Windows 上运行 boot2Docker 时遇到了同样的问题,最终您无能为力。 (通过简单的搜索可以找到很多关于此的帖子,例如https://github.com/boot2docker/boot2docker/issues/593

我的解决方案是切换到 Ubuntu。非 linux 机器上共享卷的性能不太可能很快改变。

您可能想看看docker-osx-dev 项目,它使用 rsync 并声称 “安装的文件夹与本机 OS X 性能相当,标准文件监视机制正常工作” .

【讨论】:

  • 我觉得这很奇怪。我在虚拟机上使用 docker,它不是同一个 docker 应用程序,但虚拟化并没有给我带来问题。不过,对我来说,不同之处在于我直接通过 virtualbox,而不是使用 boot2Docker,而且我没有使用共享卷。我看到人们使用 nfs 并从共享卷中获得更好的性能。
  • 如何在不使用共享卷的情况下将文件从主机(VM 外部)获取到容器(VM 内部)?
  • 我所有的开发都是在 vim 中完成的。我在盒子里需要的任何东西都来自 git ref 或者我得到它。我还没有需要一些无法通过命令行以某种方式下载的文件的实例。我想,如果出现这种情况,我会添加一个共享文件夹,但它不会是我的工作目录。
  • 对,所以你基本上避免了这个问题。您的文件与容器存在于同一台“机器”上,因此它(几乎)就像它们在常规 linux/docker 设置上一样被挂载。这几乎是 OP 的唯一解决方案,但听起来并不是他们想要的。 (这就是为什么我在 Windows 上开发了 15 年后最终彻底改变了我的操作系统!)
  • 查看我对上面原始答案的补充。祝你好运!
猜你喜欢
  • 1970-01-01
  • 2021-05-02
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
相关资源
最近更新 更多