2017-10-29 100 views
1

我有一個Dockerfile將安裝程序複製到容器中,並且在Dockerfile中指定的默認命令是/usr/sbin/init,因爲我需要運行某些服務。通過kubectl create -f server-rc.yml命令創建容器後,我將以交互模式運行kubectl exec命令以運行該安裝程序,並通過node.js腳本自動提供輸入,命令如下所示(運行安裝程序並通過stdin自動提供輸入),它開始我的自定義服務的豆莢。註冊kubectl exec命令,同時創建新的Pod創建

一切都很好,直到現在。現在讓我們說出2個豆莢,一個豆莢死亡,一個新豆莢產生。現在,我如何確保最初在Pod上運行的這些交互式命令也可以在新生成的Pod上運行?我不確定在規範中使用commandargs是否會工作,因爲它們都以非交互模式工作。任何想法如何解決這個問題將不勝感激。

編輯:

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的腳本通過child_process.spawn開闢了test.bin然後偵聽process.stdout.on和基於什麼標準輸出上收到的,提供通過process.stdin.write輸入。

謝謝。

+0

init容器(https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)會有幫助嗎? (將節點應用程序安裝在卷中,然後由容器裝入) – VonC

+0

您可以將輸入值添加到configmap中,並將configmap作爲文件掛載到您的容器中。這將刪除交互部分 – sfgroups

回答

0

我不確定您的意思是通過互動。如果這意味着腳本需要人工交互,則不能自動執行此操作(因爲您需要有人這樣做)。

由於Kubernetes吊艙可以死任何時候你應該使腳本非交互性和擴展entrypoint/command,所以它開始實際服務器之前做的node install.js。一個例子是MySQL的官方Docker鏡像,其中defines an entrypointactually starting the server之前做了一些預配置。

由於我們沒有Dockerfile或install.js腳本,因此很難做到更精確。

編輯如果install.js在Dockerfile內運行,會更好,因爲這會加速啓動並使服務器代碼不可變。

+0

我剛剛用Dockerfile更新了我的問題,以及install.js腳本的作用。是的,腳本需要人機交互,但是我在install.js文件中模擬它以偵聽'process.stdout.on',然後將輸入寫入'process.stdin.write'。 –

+0

在這種情況下,您只需編寫一個腳本,首先執行該腳本,最後執行'/ usr/sbin/init'。這個腳本需要替換Dockerfile中的'CMD [「/ usr/sbin/init」]'。 – svenwltr

+0

通過shell腳本執行'/ usr/sbin/init'似乎不適用於我。獲取下面的錯誤'無法找到替代telinit實現產卵'。現在,我使用CMD作爲'/ usr/sbin/init'本身,但註冊了一個cron作業以在一分鐘後通過crontab運行腳本。有點哈克解決方案。 –