首页 > 解决方案 > 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) 都完好无损。

标签: node.jsjsondockerkubernetesnpm-install

解决方案


由于您已将COPY应用程序代码编辑到 Docker 映像中,因此您无需在作业规范中单独挂载它。从作业规范中删除volumes:和部分。volumeMounts:您还需要更改image:指向您使用该 Dockerfile 构建的映像的指向,并将其推送到某个 Docker 注册表。

Kubernetes 特别不适合实时开发环境。 hostPath卷实际上是一种围绕普通 Kubernetes 存储系统的逃生舱,而不是维护存储或外部内容的正常方式。除了将您的应用程序代码放在您展示的图像中之外,您还需要手动将应用程序复制到集群中的每个节点。这打破了为您提供的普通滚动升级顺序部署,并且基本上抵消了您从 Kubernetes 获得的任何优势。

这几乎看起来就像您正在尝试使用 Kubernetes 作为构建环境。为此设置专门构建或云托管的工具可能会更好地为您服务。如果您尝试使用本地源代码树并npm run build在其上,则使用本地 Node 安装将比您在此处显示的要容易得多。


推荐阅读