2017-10-18 78 views
0

我拉我的头发一个星期,但我接近放弃。请分享你的智慧。Nodejs Kubernetes部署不断崩溃

这是我的泊坞文件:

FROM node 
RUN apt-get update 

RUN mkdir -p /var/www/stationconnect 
RUN mkdir -p /var/log/node 


WORKDIR /var/www/stationconnect 
COPY stationconnect /var/www/stationconnect 
RUN chown node:node /var/log/node 
COPY ./stationconnect_fromstage/api/config /var/www/stationconnect/api/config 
COPY ./etc/stationconnect /etc/stationconnect 
WORKDIR /var/www/stationconnect/api 
RUN cd /var/www/stationconnect/api 
RUN npm install 

RUN apt-get install -y vim nano 
RUN npm install supervisor forever -g 


EXPOSE 8888 

USER node 

WORKDIR /var/www/stationconnect/api 

CMD ["bash"] 

它工作在泊坞窗独自例如运行良好

docker run -it 6bcee4528c7c 

有什么建议吗?

+0

分享'kubectl describe __pod__'和'kubectl logs __pod__' – 3h4x

回答

0

这是显而易见的。您正在使用与docker run -it <container>交互式终端bash会话来运行它。当你在kube中运行一个容器(或者在没有-it的docker中)时,bash会立即退出,所以这就是它在kube部署中所做的事情。不说每次都会崩溃,只是按预期终止。

将您的命令改为一些持久的过程。即使sleep 1d会做 - 它将不再死。您的节点应用程序也不会工作,因为您需要使用魔法命令在前台启动您的应用程序。

0

您可以将ENTRYPOINT命令添加到您的Dockerfile中,该命令执行在后台无限期运行的内容,例如,您运行脚本my_service.sh。这反过来可以启动一个像nginx这样的服务器,或者简单地做一个tail -f/dev/null。这将使您的吊舱在kubernetes中运行,因为此容器的主要任务尚未完成。在上面的Dockerfile中,bash被执行,但是一旦它运行完成并且容器完成。因此,当您尝试执行kubectl运行名称--image = YOUR_IMAGE它无法连接,因为k8s在新的容器启动后几乎立即终止运行容器的容器。这个过程将会像这样无限地继续下去。

请参阅this answer这里进行在线命令,可以帮助你运行你的形象是为了调试的目的...

1

当创建一个容器,你应该有一个前台进程,以保持容器活着。

什么,我所做的是增加一个shell脚本线 while true; do sleep 1000; donedocker-entrypoint.sh结束,并指它在ENTRYPOINT [/docker-entrypoint.sh]

看看this issue以了解更多信息。

有一个example如何使一个Nodejs dockerfile,一定要检查出来。