我一直在搞乱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?
答案 0 :(得分:3)
将本地计算机的node_modules挂载到容器时,存在几个问题,例如:
1)node_modules具有本地符号链接,这些符号链接很难在您的容器内部解析。
2)如果您具有依赖于本机二进制文件的依赖项,则将为安装了依赖项的操作系统编译它们。如果将它们安装到其他操作系统,则运行这些二进制文件会出现问题。您是在Win / Mac上运行npm install
并将其从上图安装到基于linux的容器吗?然后,这很可能是您的问题。
我们在团队内部直接在Kubernetes吊舱/容器中开发软件时遇到了完全相同的问题。因此,我们启动了一个名为DevSpace CLI的开源项目:https://github.com/covexo/devspace
DevSpace CLI可以在本地文件夹和dev容器内的文件夹之间建立可靠且超快速的2路代码同步(适用于任何Kubernetes集群,任何卷,甚至适用于临时/非永久文件夹),并且设计用于与热加载工具(例如nodemon)完美配合。让我知道它是否对您有用,或者您缺少什么。