我有一个包含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
循环。
手动检查吊舱后:
kubectl exec -ti my-pod -- bash
I have no name!@my-pod:/app# cat /etc/passwd
... empty response
- > 看来容器上没有系统用户,这使得大多数命令(如npm
)无声地失败并终止容器
我也试过,没有成功:
node
用户运行node
图片 - > unable to find user node: no matching entries in passwd file
最后一点:我实际上有很多部署(使用相同的模板只有不同的名称),这些部署运行正常,几天前构建的图像 具有相同的源代码
对于某些部署,它实际上在手动删除pod并让kubernetes重新创建它之后起作用。
有什么想法吗?
编辑18/01/2018 我尝试使用旧工作图像使用的相同源代码重建图像,但没有成功。我还尝试了一个更简单的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命令手动运行时,我的图像 会运行 。
答案 0 :(得分:0)
我试图重现你的问题,但没有像同样的方式让它失败。我创建了一个dummy express app并将其粘贴在与上面示例相匹配的github上,然后将其调用到我所拥有的本地minikube实例中。基本图像尺寸相当大,但它启动得很好。
由于您没有指定,我必须解释npm start
中您的示例中发生的事情,但您可以看到我的package.json,我怀疑它与您的情况非常接近;根据描述做。
当我解雇时:
git clone https://github.com/heckj/dummyexpress
cd dummyexpress
kubectl apply -f deploy/
我立刻得到了一个正在运行的实例:
NAME READY STATUS RESTARTS AGE
dummynodeapp-7788b95497-tkw2s 1/1 Running 0 1d
日志显示了您的期望:
**kubectl log dummynodeapp-7788b95497-tkw2s**
W0117 19:41:00.986498 20648 cmd.go:353] log is DEPRECATED and will be removed in a future version. Use logs instead.
Starting application
> blah@1.0.0 start /app
> node index.js
Example app listening on port 3000!
我的猜测是,您在npm start
执行过程中出现了问题,所以我建议您调整部署的这个方面,看看您是否能够解决问题那样。
答案 1 :(得分:0)
正如@heckj指出的那样,这是我的kubernetes集群上的Docker问题。我将群集从1.6.13-gke.1
更新为v1.7.12-gke.0
,并且pod再次正常运行。我不确定使用了什么Docker版本,因为another kubernetes bug导致我无法看到它。