簡體   English   中英

在Kubernetes中的Pod創建時是否可以指定Docker映像構建參數?

[英]Is it possible to specify a Docker image build argument at pod creation time in Kubernetes?

我有一個由三個服務組成的基於Node.JS的應用程序。 一個是Web應用程序,兩個是內部API。 Web應用程序需要與API對話才能完成其工作,但是我不想將其他服務的IP地址和端口硬編碼到代碼庫中。

在我的本地環境中,我正在使用漂亮的envify Node.JS模塊來解決此問題。 基本上,我可以假裝在編寫代碼時可以訪問環境變量,然后使用envify CLI工具將這些變量轉換為最終瀏覽器化文件中的硬編碼字符串。

我想將這個解決方案容器化並將其部署到Kubernetes。 這是我遇到問題的地方...

我在Docker映像模板中定義了幾個ARG變量。 這些通過RUN export FOO=${FOO}變成環境變量,在運行npm run-script build我有了所需的容器。 好的,所以我可以運行:

docker build . -t residentmario/my_foo_app:latest --build-arg FOO=localhost:9000 BAR=localhost:3000

然后使用docker push送到注冊表。

我對這種方法的不滿是,我僅成功地將硬編碼的變量添加到了容器映像中。 真正想要的是在pod初始化時定義路徑。 這可能嗎?

編輯 :這是兩個解決方案。

開始后

Kubernetes帶有一個稱為PostStart的生命周期掛鈎。 這在“ 容器生命周期掛鈎 ”中進行了簡要描述。

容器達到ContainerCreated狀態后即會觸發該鈎子,例如,容器已完成拉出並已完全初始化。 然后,您可以使用鈎子跳入容器並運行任意命令。

在我們的例子中,我可以創建一個PostStart事件,該事件在觸發時將使用正確的路徑重建應用程序。

除非您創建了一個實際上不運行任何東西的Docker映像(這對我來說似乎是錯的,但是請告訴我是否認為這是可以的做法),否則這確實需要一些重復的工作:停止應用程序,重新運行構建過程以及再次啟動應用程序。

命令

根據下面的評論,此事件不一定在正確的時間觸發。 這是保證可以正常工作的另一種方法(因此是上乘的)。

一個有用的Docker容器在為應用程序提供服務的CMD上帶有一些變體。 您可以在Kubernetes中覆蓋此運行命令,如文檔的“定義容器的命令和參數”部分中所述。

因此,我在pod定義中添加了一個command ,該command運行一個shell腳本,該腳本(1)使用正確的路徑重建應用程序,並作為環境變量提供給pod,並且(2)開始為該應用程序提供服務:

command: ["/bin/sh"]
args: ["./scripts/build.sh"]

像魅力一樣工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM