如何在 Docker 容器中加速 node.js 反应启动
How can I speed up node.js react startup in a Docker container
我在 Docker 容器中 运行ning node js 官方镜像,我注意到 npm start 命令的启动时间比在 Docker 外部时要长得多。
是否有我可以更改的设置以使其 运行 更快?也许为容器分配更多内存?
为了参考,我将相关文件粘贴在下面。
Docker文件:
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
我用来启动容器的命令:
docker run --rm -ti \
--link api-container:api \
--name my-container -p 3000:3000 \
-v $(pwd):/var/www/app nxmohamad/my-container \
bash
并且启动脚本只是 NODE_PATH=. react-scripts start
使用 osxfs will be slower than normal file access 从主机 > 虚拟机 > 容器绑定挂载。 Linux 文件缓存受到影响,以在主机和容器之间实现 "consistency"。一些依赖文件缓存来提高速度的应用程序可能会变慢。 PHP 带有框架的 Web 应用特别容易受到攻击,因为它们会在每次请求时加载所有文件。
React 可能处于稍微好一点的位置,因为文件读取只在启动时发生一次,但每次启动时这些读取仍然很慢。
任何主动写入目录的东西都会变慢。
解决方法
缓存
一些 caching options were added to mounts in Docker 17.06 以便用户可以控制超出默认 'consistent' 级别的安装,其中所有读取都从容器传递到 OSX。
node_modules
目录很可能是速度缓慢的主要原因,它也是启用缓存的最安全位置,因为它不经常更改。
根据您的目录结构,此设置可能会变得冗长,因为您必须将每个项目独立安装到您的应用程序目录中:
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
正在同步
另一种选择是使用 rsync
或 unison
之类的工具来保持本地卷同步,而不是依赖 OSX 或 Windows 的绑定安装。
专门为此编写了一个名为docker-sync的工具。获得一个有效的配置可能有点困难,有时它会让自己陷入困境(如果我在暂停时离开它 运行 会导致几个内核错误)但它最终会起作用。
我在 Docker 容器中 运行ning node js 官方镜像,我注意到 npm start 命令的启动时间比在 Docker 外部时要长得多。
是否有我可以更改的设置以使其 运行 更快?也许为容器分配更多内存?
为了参考,我将相关文件粘贴在下面。
Docker文件:
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
我用来启动容器的命令:
docker run --rm -ti \
--link api-container:api \
--name my-container -p 3000:3000 \
-v $(pwd):/var/www/app nxmohamad/my-container \
bash
并且启动脚本只是 NODE_PATH=. react-scripts start
使用 osxfs will be slower than normal file access 从主机 > 虚拟机 > 容器绑定挂载。 Linux 文件缓存受到影响,以在主机和容器之间实现 "consistency"。一些依赖文件缓存来提高速度的应用程序可能会变慢。 PHP 带有框架的 Web 应用特别容易受到攻击,因为它们会在每次请求时加载所有文件。
React 可能处于稍微好一点的位置,因为文件读取只在启动时发生一次,但每次启动时这些读取仍然很慢。
任何主动写入目录的东西都会变慢。
解决方法
缓存
一些 caching options were added to mounts in Docker 17.06 以便用户可以控制超出默认 'consistent' 级别的安装,其中所有读取都从容器传递到 OSX。
node_modules
目录很可能是速度缓慢的主要原因,它也是启用缓存的最安全位置,因为它不经常更改。
根据您的目录结构,此设置可能会变得冗长,因为您必须将每个项目独立安装到您的应用程序目录中:
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
正在同步
另一种选择是使用 rsync
或 unison
之类的工具来保持本地卷同步,而不是依赖 OSX 或 Windows 的绑定安装。
专门为此编写了一个名为docker-sync的工具。获得一个有效的配置可能有点困难,有时它会让自己陷入困境(如果我在暂停时离开它 运行 会导致几个内核错误)但它最终会起作用。