我一直在摆弄 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 进程,但我真的不确定我的错误在哪里。
编辑:
我稍微缩小了范围。它正在从文件主机安装 node_modules
,这就是导致它崩溃的原因。我确实有一个 .dockerignore 文件设置。有没有办法让它像这样工作(所以如果我运行 npm install
它将获取更改)或者有没有办法让它使用与图像一起安装的 node_modules ?
最佳答案
将本地计算机的 node_modules 挂载到容器时会遇到几个问题,例如:
1) node_modules 有本地符号链接(symbolic link),在你的容器内不容易解析。
2) 如果您有依赖 native 二进制文件的依赖项,它们将针对您安装依赖项的操作系统进行编译。如果将它们安装到不同的操作系统,运行这些二进制文件将会出现问题。您是否在 Win/Mac 上运行 npm install
并将其安装到上图中基于 linux 的容器构建?那么,这很可能是您的问题。
我们的团队在直接在 Kubernetes pod/容器内开发软件时遇到了完全相同的问题。这就是我们启动名为 DevSpace CLI 的开源项目的原因:https://github.com/covexo/devspace
DevSpace CLI 可以在本地文件夹和开发容器内的文件夹之间建立可靠且超快速的双向代码同步(适用于任何 Kubernetes 集群、任何卷,甚至临时/非持久文件夹)并且它是旨在与 nodemon 等热重载工具完美配合。让我知道它是否适合您,或者您是否缺少任何东西。
关于node.js - Nodemon 使我的 Kubernetes 部署崩溃(导致问题的 Node 模块),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47382240/