Kubernetes 找不到模块'/usr/src/app/server.js';
我已经在本地使用minikube测试了这个应用程序,它可以正常工作。当我对deploymnt.yml使用相同的Doeckerfile时,pod返回到错误状态,原因如下 错误:找不到模块“/usr/src/app/server.js” Dockerfile: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
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
imagePullPolicy:Never
的原因
- 现在我将部署它:
- 无论何时需要在pod内进行故障排除,都可以使用
(或kubectl exec-it--/bin/sh
,具体取决于基本图像。)/bin/bash
Dockerfile
中所述的WORKDIR
文件夹中
- 最后,让我们测试从集群外部访问:
minikube ssh
中构建Docker映像,以便缓存它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