Kubernetes无法部署有效的容器映像

时间:2018-01-17 20:04:53

标签: node.js docker kubernetes

我有一个包含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命令手动运行时,我的图像 会运行

2 个答案:

答案 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导致我无法看到它。