node.js - NPM enoent ENOENT:没有这样的文件或目录,在 kubernetes 作业运行期间打开 '/usr/src/app/package.json
问题描述
我有 node(node:10) Dockerfile 和自定义 package-lock.json , package.json ,所以使用这个 dockerfile 我需要创建一个 dockerimage 然后我想运行 kubernetes job (kind:job) 作为一次性任务意味着如果任务结束,您的 pod 将被杀死,还需要将 /usr/src/app/ 和 /usr/src/app/node_modules 的输出挂载到我的 kubernetes 主机路径以提供静态内容。
Dockerfile:-
FROM node:10
WORKDIR /usr/src/app/
#COPY package*.json /usr/src/app/
COPY . /usr/src/app/
RUN npm install
Dockerfile 目录中已经存在的文件:-
Dockerfile README.md codegen.yml package-lock.json package.json public src tsconfig.json
Kubernetes 作业文件:-
apiVersion: batch/v1
kind: Job
metadata:
name: workspace-forntend
spec:
template:
metadata:
name: workspace-forntend
spec:
containers:
- name: workspace-forntend
image: node:10 (dummy path for public post)
imagePullPolicy: IfNotPresent
command: ["/bin/bash","-c"]
args: ["npm run build"]
volumeMounts:
- name: mount-1
mountPath: /usr/src/app/
- name: mount-2
mountPath: /usr/src/app/node_modules
volumes:
- name: mount-1
hostPath:
path: /root/mount-1
type: DirectoryOrCreate
- name: mount-2
hostPath:
path: /root/mount-2
type: DirectoryOrCreate
restartPolicy: Never
但是出现错误:-
npm ERR! code ENOENT
npm ERR! syscall open
npm ERR! path /usr/src/app/package.json
npm ERR! errno -2
npm ERR! enoent ENOENT: no such file or directory, open '/usr/src/app/package.json'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent
npm ERR! A complete log of this run can be found in:
注意:- 所有权限 (777)、路径 /usr/src/app (pwd)、用户 (root) 都完好无损。
解决方案
由于您已将COPY
应用程序代码编辑到 Docker 映像中,因此您无需在作业规范中单独挂载它。从作业规范中删除volumes:
和部分。volumeMounts:
您还需要更改image:
指向您使用该 Dockerfile 构建的映像的指向,并将其推送到某个 Docker 注册表。
Kubernetes 特别不适合实时开发环境。 hostPath
卷实际上是一种围绕普通 Kubernetes 存储系统的逃生舱,而不是维护存储或外部内容的正常方式。除了将您的应用程序代码放在您展示的图像中之外,您还需要手动将应用程序复制到集群中的每个节点。这打破了为您提供的普通滚动升级顺序部署,并且基本上抵消了您从 Kubernetes 获得的任何优势。
这几乎看起来就像您正在尝试使用 Kubernetes 作为构建环境。为此设置专门构建或云托管的工具可能会更好地为您服务。如果您尝试使用本地源代码树并npm run build
在其上,则使用本地 Node 安装将比您在此处显示的要容易得多。
推荐阅读
- html - 如何自动调整较小图像的大小以适应大 div?
- android - 如何检查我是否单击外部链接并从在 xamarin 的 web 视图中打开的站点打开它
- html - Always have Active Class shown in scroll bar
- javascript - 雷达图中的可点击标签 - 带有 Vue 的 Charjs
- java - javax.websocket.EncodeException: No encoder specified for object of class [class java.util.ArrayList]
- flutter - Can Dart SDK be Installed on Windows 8
- open-telemetry - opentelemetry-java source code compile failed
- html - Enable/Disable button according with the data values
- reactjs - Components does not render by Routes
- spring-boot - SpringBoot Openshift POST io.undertow.util.ParameterLimitException: UT000047: The number of parameters exceeded the maximum of 1000