我有一个Dockerfile,它将安装程序复制到容器中,而Dockerfile中指定的默认命令是/usr/sbin/init
,因为我需要运行某些服务。通过kubectl create -f server-rc.yml
命令创建容器后,我在交互模式下运行kubectl exec命令来运行该安装程序并通过node.js脚本自动提供输入,命令就像这样kubectl exec $container -i -t -- bash -c "node install.js"
(运行安装程序并通过stdin自动提供输入,这将启动我在pod上的自定义服务。
到目前为止,一切都很好。现在让我们说出2个豆荚,一个豆荚死亡,一个新豆荚产卵。现在,我如何确保我最初在pod上运行的这些交互式命令也可以在新生成的pod上运行?我不确定在规范中使用command
和args
是否有效,因为它们都在非交互模式下工作。如何解决这个问题的任何想法都将不胜感激。
修改
Dockerfile(部分代码):
FROM centos:7
ENV container docker
RUN yum -y update; yum clean all
VOLUME [ “/sys/fs/cgroup” ]
RUN yum -y install nodejs npm && npm install progress
RUN mkdir -p /tmp
COPY ./install.js /tmp
COPY ./test.bin /tmp/
CMD ["/usr/sbin/init"]
node.js脚本通过test.bin
打开child_process.spawn
,然后侦听process.stdout.on
并根据stdout上收到的内容,通过process.stdin.write
提供输入。
感谢。
答案 0 :(得分:0)
我不确定您的互动意味着什么。如果这意味着脚本需要人工交互,则无法自动化(因为您需要有人这样做)。
由于Kubernetes Pods可以在任何时候死亡,你应该使脚本非交互式并扩展entrypoint / command,所以它在启动实际服务器之前执行node install.js
。一个例子是MySQL的官方Docker镜像,defines an entrypoint并在actually starting the server之前进行一些预配置。
很难更准确,因为我们没有Dockerfile或install.js
脚本。
编辑如果install.js
在Dockerfile中运行会更好,因为这会加快启动并使服务器代码不可变。