我把头发拉了一个星期,但我已经接近放弃了。请分享你的智慧。
这是我的Docker文件:
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时运行正常。
docker run -it 6bcee4528c7c
有什么建议吗?
答案 0 :(得分:1)
创建容器时,应该有一个前台进程来保持容器处于活动状态。
我所做的是添加一个shell脚本行
我的 docker-entrypoint.sh 末尾的while true; do sleep 1000; done
,并在ENTRYPOINT [/docker-entrypoint.sh]
请查看this issue了解详情。
有example如何制作Nodejs dockerfile,请务必查看。
答案 1 :(得分:0)
docker run -it <container>
的交互式终端bash会话运行它。当您在kube中运行容器时(或在没有-it
的docker中)bash将立即退出,因此这就是它在kube部署中所做的事情。不会崩溃,只是按预期终止。
将命令更改为持久的过程。即使sleep 1d
也会这样做 - 它将不再死亡。你的节点应用程序也不会工作......因为你需要你的魔术命令才能在前台启动你的应用程序。
答案 2 :(得分:0)
您可以向Dockerfile添加ENTRYPOINT命令,该命令执行在后台无限期运行的某些内容,例如,您运行脚本 my_service.sh 。反过来,这可以启动像nginx这样的服务器或者只是执行 tail -f / dev / null 。这将使您的pod在kubernetes中运行,因为此容器的主要任务尚未完成。在上面的Dockerfile中,执行了bash,但是一旦运行它就完成了,容器就完成了。因此,当您尝试执行 kubectl运行NAME --image = YOUR_IMAGE 时,它无法连接,因为k8s在新pod启动后几乎立即终止运行容器的pod。这个过程将无限地继续下去。
请在此处查看this answer以获取内联命令,该命令可帮助您按原样运行映像以进行调试...