Kubernetes 找不到模块'/usr/src/app/server.js';

Kubernetes 找不到模块'/usr/src/app/server.js';,kubernetes,Kubernetes,我已经在本地使用minikube测试了这个应用程序,它可以正常工作。当我对deploymnt.yml使用相同的Doeckerfile时,pod返回到错误状态,原因如下 错误:找不到模块“/usr/src/app/server.js” Dockerfile: FROM node:13-alpine WORKDIR /api COPY package.json . RUN npm install COPY . . EXPOSE 3000 CMD ["node", "server.js"] Depl

我已经在本地使用minikube测试了这个应用程序,它可以正常工作。当我对deploymnt.yml使用相同的Doeckerfile时,pod返回到错误状态,原因如下

错误:找不到模块“/usr/src/app/server.js”

Dockerfile:

FROM node:13-alpine
WORKDIR /api
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Deployment.yml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodejs-app-dep
  labels:
    app: nodejs-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nodejs-app
  template:
    metadata:
      labels:
        app: nodejs-app
    spec:
      serviceAccountName: opp-sa
      imagePullSecrets:
        - name: xxx
      containers:
      - name: nodejs-app
        image: registry.xxxx.net/k8s_app
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3000
假设“node_modules”可能有问题,我在Dockerfile中的WORDIR上有“ls”,它确实显示了“node_modules”。是否还有其他人需要检查以解决此问题?

  • 因为我不能给你这个级别的评论建议,所以我给你写了一个完全有效的例子,这样你可以和你的比较,看看是否有不同之处
来源:

  • 您的Dockerfile:
  • 示例
    package.json
  • 构建图像:
  • 便于访问的部署示例+服务(称为
    nodejs app.yaml
    ):
注意:我在本例中使用minikube docker注册表,这就是设置
imagePullPolicy:Never
的原因


  • 现在我将部署它:
  • 无论何时需要在pod内进行故障排除,都可以使用
    kubectl exec-it--/bin/sh
    (或
    /bin/bash
    ,具体取决于基本图像。)
pod正在运行,文件位于
Dockerfile
中所述的
WORKDIR
文件夹中

  • 最后,让我们测试从集群外部访问:
Hello World正在按需要提供服务

总结如下:

  • 我在
    minikube ssh
    中构建Docker映像,以便缓存它
  • 创建包含指向映像的部署的清单,添加服务部件以允许使用Nodeport进行外部访问
  • NodePort
    将所有流量路由到分配给服务的端口(即:31446)中的Minikube IP,并传送到与8080端口上侦听的选择器匹配的POD

  • 一些疑难解答提示:

    • pod
      :当pod状态出现任何错误时,提供宝贵信息
    • kubectl exec
      非常适合在容器运行时对其内部进行故障排除,它非常类似于
      docker run
      命令
    • 检查代码文件,确保其中没有烘焙路径
    • 尝试使用
      WORKDIR/usr/src/app
      而不是
      /api
      ,看看是否得到不同的结果
    • 尝试在其内容上使用带有
      node\u modules
      的文件

    如果您需要更多帮助,请尝试并在评论中告诉我,谢谢您的详细评论。对你的回复限制在30个字符以内,因此我将以新评论的形式发布

    我的问题昨天解决了。这是一份复印件

    它在我的本地应用程序中运行得非常好,但是,当我尝试使用相同的Dockerfile部署到集群时,遇到了“找不到模块…”的问题

    因此,当提到目录路径而不是。复制文件时

    COPY /api /usr/app         #copy project basically
    WORKDIR /usr/app           #set workdir just before npm install
    RUN npm install
    EXPOSE 3000
    

    在安装“node_模块”之前移动WORKDIR语句在我的案例中起作用。我很惊讶地发现这是一个问题,尽管它在本地使用COPY

    本地运行图像或从注册表运行图像的过程基本上与kubernetes相同,您是否尝试在注册表中重新创建图像?是的,我尝试了注册表并成功!但出于某种原因,它抱怨说在KUbernets上找不到server.js,尽管我可以通过“ls-ltr”看到这些文件的列表,这非常有趣,很高兴您的问题得到了解决。你应该把你的答案标记为接受,因为它是你的问题的解决方案,如果你考虑我的回答,如果你认为它是有帮助的并且研究得很好的话,我会很感激的,这样你也能帮助其他有类似问题的人得到帮助。
    {
      "name": "docker_web_app",
      "version": "1.0.0",
      "description": "Node.js on Docker",
      "author": "First Last <first.last@example.com>",
      "main": "server.js",
      "scripts": {
        "start": "node server.js"
      },
      "dependencies": {
        "express": "^4.16.1"
      }
    }
    
    'use strict';
    
    const express = require('express');
    
    // Constants
    const PORT = 8080;
    const HOST = '0.0.0.0';
    
    // App
    const app = express();
    app.get('/', (req, res) => {
      res.send('Hello World');
    });
    
    app.listen(PORT, HOST);
    console.log(`Running on http://${HOST}:${PORT}`);
    
    $ ls
    Dockerfile  package.json  server.js
    
    $ docker build -t k8s_app .
    ...
    Successfully built 2dfbfe9f6a2f
    Successfully tagged k8s_app:latest
    
    $ docker images k8s_app
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    k8s_app             latest              2dfbfe9f6a2f        4 minutes ago       118MB
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nodejs-app-dep
      labels:
        app: nodejs-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nodejs-app
      template:
        metadata:
          labels:
            app: nodejs-app
        spec:
          containers:
          - name: web-app
            image: k8s_app
            imagePullPolicy: Never
            ports:
            - containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: web-app-svc
    spec:
      type: NodePort
      selector:
        app: nodejs-app
      ports:
        - port: 8080
          targetPort: 8080
    
    $ kubectl apply -f nodejs-app.yaml 
    deployment.apps/nodejs-app-dep created
    service/web-app-svc created
    $ kubectl get pods
    NAME                              READY   STATUS    RESTARTS   AGE
    nodejs-app-dep-5d75f54c7d-mfw8x   1/1     Running   0          3s
    
    $ kubectl exec -it nodejs-app-dep-5d75f54c7d-mfw8x -- /bin/sh
    /api # ls
    Dockerfile         node_modules       package-lock.json  package.json       server.js
    
    $ minikube service list
    |-------------|-------------|--------------|-------------------------|
    |  NAMESPACE  |    NAME     | TARGET PORT  |           URL           |
    |-------------|-------------|--------------|-------------------------|
    | default     | web-app-svc |         8080 | http://172.17.0.2:31446 |
    |-------------|-------------|--------------|-------------------------|
    
    $ curl -i http://172.17.0.2:31446
    HTTP/1.1 200 OK
    X-Powered-By: Express
    Content-Type: text/html; charset=utf-8
    Content-Length: 11
    ETag: W/"b-Ck1VqNd45QIvq3AZd8XYQLvEhtA"
    Date: Thu, 14 May 2020 18:49:40 GMT
    Connection: keep-alive
    
    Hello World$
    
    COPY /api /usr/app         #copy project basically
    WORKDIR /usr/app           #set workdir just before npm install
    RUN npm install
    EXPOSE 3000