Nodemon 正在使我的 Kubernetes 部署崩溃(导致问题的 node_modules)

Posted

技术标签:

【中文标题】Nodemon 正在使我的 Kubernetes 部署崩溃(导致问题的 node_modules)【英文标题】:Nodemon is crashing my Kubernetes deployment (node_modules causing the issue) 【发布时间】:2018-05-03 02:17:12 【问题描述】:

我一直在玩 kubernetes,我正在尝试使用 minikube、node 和 nodemon 设置开发环境。如果我在独立容器中运行它,我的图像可以正常工作,但是如果我将它放在我的部署中,它会崩溃并出现以下错误。

yarn run v1.3.2
$ nodemon --legacy-watch --exec babel-node src/index.js
/app/node_modules/.bin/nodemon:2
'use 
^^^^^
 SyntaxError: Invalid or unexpected token
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:599:28)
    at Object.Module._extensions..js (module.js:646:10)
    at Module.load (module.js:554:32)
    at tryModuleLoad (module.js:497:12)
    at Function.Module._load (module.js:489:3)
    at Function.Module.runMain (module.js:676:10)
    at startup (bootstrap_node.js:187:16)
    at bootstrap_node.js:608:3
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

我的 package.json 中有一个 dev 命令

"dev": "nodemon --legacy-watch --exec babel-node src/index.js",

我的镜像正在使用以下 docker 文件构建

FROM node:8.9.1-alpine

WORKDIR /app

COPY . /app/

RUN cd /app && yarn install

我的部署就是这样设置的

---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  labels:
    app: nodeapp
  name: nodeapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nodeapp
  template:
    metadata:
      labels:
        app: nodeapp
    spec:
      containers:
      - name: nodeapp
        imagePullPolicy: Never
        image: app:latest
        command:
        - yarn
        args:
        - run
        - dev
        ports:
          - containerPort: 8080
        volumeMounts:
        - name: code
          mountPath: /app
      volumes:
      - name: code
        hostPath:
          path: /Users/adam/Workspaces/scratch/expresssite
---
apiVersion: v1
kind: Service
metadata:
  name: nodeapp
  labels:
    app: nodeapp
spec:
  selector:
    app: nodeapp
  ports:
  - name: nodeapp
    port: 8080
    nodePort: 30005
  type: NodePort
---

它显然在 nodemon binstub 中的'use strict' 上崩溃了,但我不知道为什么。它作为一个独立的 docker 容器工作得很好。目标是在我保存更改以供开发时让 nodemon 在每个 pod 中重新启动节点进程,但我真的不确定我的错误在哪里。

编辑:

我已经稍微缩小了范围。它正在从文件主机安装node_modules,这就是导致它崩溃的原因。我确实有一个 .dockerignore 文件设置。有没有办法让它像这样工作(所以如果我运行 npm install 它将获取更改)或者有没有办法让它使用与图像一起安装的 node_modules?

【问题讨论】:

如果您可以在容器中运行babel-node src/index.js 并在更改时从主机重新启动容器,所涉及的层会少很多。不过,我不确定kubectl 是否可行。 nodemon 并不是真正设计为头容器进程。 我最终解决了这个问题。只是一种解决方法。只挂载了我需要监视的目录。 【参考方案1】:

将本地计算机上的 node_modules 挂载到容器时有几个问题,例如:

1) node_modules 具有本地符号链接,在您的容器内不容易解析。

2) 如果您有依赖于本机二进制文件的依赖项,它们将针对您安装依赖项的操作系统进行编译。如果将它们安装到不同的操作系统,运行这些二进制文件会出现问题。您是否在 Win/Mac 上运行 npm install 并将其从上图安装到基于 linux 的容器构建中?那么,这很可能是您的问题。

我们在团队中直接在 Kubernetes pod/容器中开发软件时遇到了完全相同的问题。这就是为什么我们启动了一个名为 DevSpace CLI 的开源项目:https://github.com/covexo/devspace

DevSpace CLI 可以在本地文件夹和开发容器中的文件夹之间建立可靠且超快速的 2 向代码同步(适用于任何 Kubernetes 集群、任何卷,甚至适用于临时/非持久文件夹),它是旨在与 nodemon 等热重载工具完美配合。让我知道它是否适合您,或者您是否缺少任何东西。

【讨论】:

感谢您回来。老实说,我完全忘记了这一点。不过时机很好,因为我们正在将堆栈切换到我现在所在的 docker 和 kubernetes,我相信这会有所帮助!谢谢,我很快就会看看一些点! :)

以上是关于Nodemon 正在使我的 Kubernetes 部署崩溃(导致问题的 node_modules)的主要内容,如果未能解决你的问题,请参考以下文章

Nodemon 与 gulp watch 绑定时崩溃并重新启动两次以上

[NODEMON]- babel-node 未被识别为内部或外部命令

Docker /bin/bash: nodemon: 找不到命令

使用 nodemon 启动 Loopback

Nodemon没有重新加载页面

打字稿更改后nodemon没有重新启动