【问题标题】:How can I speed up node.js react startup in a Docker container如何加快 Docker 容器中的 node.js 反应启动
【发布时间】:2017-11-26 07:58:47
【问题描述】:

我在 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

我用来启动容器的命令:

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

【问题讨论】:

  • 您能否提供有关您的应用程序以及如何运行它的更多详细信息?它慢了多少?您的应用程序在启动时会做什么?您使用什么命令/配置来运行它? Docker 容器通常不会在主机操作系统之上增加大量开销。
  • 嗨@Matt,谢谢你的评论。我已经包含了我的 Dockerfile 内容并提到了我的启动脚本。
  • 您是使用 Docker for Mac 还是 Docker for Windows 并将本地应用程序开发目录绑定挂载到容器中?
  • Docker for Mac。我现在将使用用于运行容器的命令更新我的问题。

标签: docker docker-for-mac


【解决方案1】:

使用osxfs 从主机绑定安装 > VM > 容器将是slower than normal file access。 Linux 文件缓存受到影响以实现主机和容器之间的“一致性”。一些依赖文件缓存来提高速度的应用程序可能会变慢。带有框架的 PHP Web 应用程序尤其受到打击,因为它们会在每个请求上加载所有文件。

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

任何主动写入目录的东西都会变慢。

解决方法

缓存

一些caching options were added to mounts in Docker 17.06,因此用户可以控制超出默认“一致”级别的挂载,其中所有读取都从容器传递到 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

同步

另一种选择是使用 rsyncunison 之类的工具来保持本地卷同步,而不是依赖于 OSX 或 Windows 的绑定挂载。

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

【讨论】:

  • 非常感谢您的详细解释。我将研究这个选项并尝试一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 2020-02-07
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
相关资源
最近更新 更多