【发布时间】:2018-01-19 18:48:26
【问题描述】:
我有一个包含 NodeJS 应用程序的 docker 映像。 Dockerfile 是:
FROM node:8
WORKDIR /app
ADD . /app
RUN npm install
EXPOSE 80
ENTRYPOINT [ "/bin/sh", "./start.sh" ]
start.sh 脚本是:
#!/bin/bash
...
echo "Starting application"
npm start
我可以手动启动和测试映像:
$ gcloud docker -- run -it --rm my-container
...
Starting application
...
> node index.js
...
Kubernetes 部署使用相同的容器:
apiVersion: extensions/v1beta1
kind: Deployment
...
spec:
...
template:
...
spec:
containers:
- image: my-container
...
容器启动,start.sh 脚本正确执行,但它终止,容器进入CrashLoopBackOff 循环。
手动检查 pod 后:
kubectl exec -ti my-pod -- bash
I have no name!@my-pod:/app# cat /etc/passwd
... empty response
-> 不知何故,容器上似乎没有系统用户,这使得大多数命令(如npm)静默失败并终止容器
我也试过了,没有成功:
- 删除 pod
- 删除并重新创建部署
- 使用
node用户运行node映像->unable to find user node: no matching entries in passwd file
最后一点:我实际上有很多部署(使用相同的模板,只是名称不同),使用几天前构建的映像运行良好使用相同的源代码。
对于某些部署,它实际上是在手动删除 pod 并让 kubernetes 重新创建它之后工作的。
有什么想法吗?
2018 年 1 月 18 日编辑 我尝试使用与旧工作图像相同的源代码重建图像,但没有成功。我还尝试了一个更简单的 Dockerfile:
FROM node:8
USER node
但我仍然收到与似乎没有用户在场有关的错误:
Error response from daemon: {"message":"linux spec user: unable to find user node: no matching entries in passwd file"}
我已经检查了 docker-node 的家伙,图像最近没有改变。会不会和 Kubernetes 的变化有关?请记住,当我使用 docker 命令手动运行图像时,我的图像确实会运行。
【问题讨论】:
-
日志是怎么说的?
-
@DavidSteiman pod 日志显示
Starting application,但随着 pod 终止,接下来什么也没有发生。正如我所解释的,当直接查看容器时,我发现没有系统用户,因此像npm start或node --version这样的命令根本没有效果(甚至没有输出错误)。 -
直接启动脚本怎么样,这里提到:kubernetes.io/docs/tutorials/stateless-application/…
-
我需要在
npm start之前运行一些逻辑,所以我不能直接使用CMD指令,如果这是你的建议 -
为什么不在 npm 任务中实现该逻辑?
标签: node.js docker kubernetes