我已经设置了一个Docker容器来开发node.js项目。我想使用所有ES6功能,所以我使用babel-node
作为转换器,但遇到了一个问题,即trasnpiling进程在Docker中花费了太多时间。
我正在从我的主机安装app目录(所以我可以在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脚本中设置的,该脚本在ENTRYPOINT
的{{1}}中设置。
Dockerfile
:
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
会立即检测到更改,但服务器重启大约需要半分钟。如果不通过babel编译nodemon
,它会快得多。
此外,当我在我的主机上运行相同的项目时(我的主机是带有2.5 GHz Intel Core i7处理器和16gb内存的MacbookPro),省略ES6
,一切都足够快。所以我确信问题出在Docker
。
我的问题是: 为什么babel-node在Docker容器中转换得如此之慢?有办法限制它吗?
答案 0 :(得分:4)
在OS X上运行Docker需要使用 Docker Machine 。来自Docker OS X docs:
因为Docker守护程序使用特定于Linux的内核功能,所以 无法在OS X中本机运行Docker。您必须使用 docker-machine创建并附加到虚拟机(VM)。这个 machine是一个Linux VM,可以在Mac上为您托管Docker。
通过VM挂载文件,然后随后进入正在运行的容器慢。从主机提供文件通常是可以的,但是希望这些文件能够被监视,编译和同步。
几年前,当我在 boot2Docker 上运行时,我在Windows上遇到了同样的问题,最终你无法做到这一点。 (通过简单搜索可以获得大量帖子,例如https://github.com/boot2docker/boot2docker/issues/593)
我的解决方案是切换到Ubuntu。非Linux机器上的共享卷的性能不太可能很快改变。
您可能希望查看使用 rsync 的docker-osx-dev项目并声明&#34;已安装的文件夹与本机OS X性能和标准文件相同观看机制正常工作&#34; 。