我有一个将安装程序复制到容器的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个 pods 中有一个 pods 死了,又有一个新的 pods 出现了。现在,如何确保最初在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
提供输入。谢谢。
最佳答案
我不确定您所说的互动是什么意思。如果这意味着脚本需要人机交互,则您无法自动执行此操作(因为您需要执行此操作的人员)。
由于Kubernetes Pods可能随时随地死亡,因此您应该使脚本非交互式并扩展entrypoint / command,因此它会在启动实际服务器之前执行node install.js
。一个示例是MySQL的官方Docker镜像,该镜像为defines an entrypoint,并在actually starting the server之前进行了一些预配置。
很难更精确,因为我们没有Dockerfile或install.js
脚本。
编辑如果install.js
在Dockerfile中运行,那会更好,因为这会加快启动速度并使服务器代码不可变。
关于kubernetes - 在创建新Pod时注册kubectl exec命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46998064/