如何加速node.js在Docker容器中启动反应

nxm*_*mad 3 docker docker-for-mac

我正在Docker容器中运行node js官方映像,我注意到npm start命令比在Docker之外启动命令需要更长的时间.

我可以更改设置以使其运行更快吗?也许为容器分配更多内存?

作为参考,我将在下面粘贴相关文件.

Dockerfile:

FROM node:8.1

WORKDIR var/www/app

# Global install yarn package manager
RUN apt-get update && apt-get install -y curl apt-transport-https && \
    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 && \
    apt-get update && apt-get install -y yarn

RUN npm install -g create-react-app
Run Code Online (Sandbox Code Playgroud)

我用来启动容器的命令:

docker run --rm -ti \
--link api-container:api \
--name my-container -p 3000:3000 \
-v $(pwd):/var/www/app nxmohamad/my-container \
bash
Run Code Online (Sandbox Code Playgroud)

并且启动脚本就是 NODE_PATH=. react-scripts start

Mat*_*att 8

从绑定主机安装> VM>集装箱与osxfs比正常的文件访问速度较慢.Linux文件缓存受到影响,以实现主机和容器之间的"一致性".某些依赖于文件缓存以提高速度的应用程序可能会变慢.带有框架的PHP Web应用程序特别受到攻击,因为它们会在每个请求上加载所有文件.

React可能处于略微更好的位置,因为文件只在启动时发生一次,但每次启动时这些读取仍然很慢.

任何积极写入目录的东西都会变慢.

解决方法

高速缓存

Docker 17.06中的一些缓存选项被添加到安装中,因此用户可以控制超出默认"一致"级别的安装,其中所有读取都从容器传递到OSX.

node_modules目录可能是导致缓慢的主要原因,它也是启用缓存的最安全的地方,因为它不会经常更改.

根据您的目录结构,此设置可能会变得冗长,因为您必须单独在app目录中安装每个项目:

docker run --rm -ti \
  --link api-container:api \
  --name my-container -p 3000:3000 \
  -v $(pwd)/index.js:/var/www/app/index.js \
  -v $(pwd)/package.json:/var/www/app/package.json \
  -v $(pwd)/src:/var/www/app/src \
  -v $(pwd)/node_modules:/var/www/app/node_modules:cached \
  nxmohamad/my-container \
  bash
Run Code Online (Sandbox Code Playgroud)

同步

另一种选择是使用类似的工具rsyncunison保持本地卷同步,而不是依赖OSX或Windows的绑定安装.

一个名为docker-sync的工具专门为此编写.获得一个有效的工作配置可能有点困难,它有时可能会陷入困境(如果我让它在暂停状态下运行会导致几个内核oopses)但它最终会起作用.