是否可以在Kubernetes的pod创建时指定Docker镜像构建参数?

时间:2018-03-11 04:06:55

标签: docker 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初始化时定义路径。这可能吗?

1 个答案:

答案 0 :(得分:0)

修改:以下是两种解决方案。

启动后

Kubernetes带有一个名为PostStart的生命周期钩子。这在“Container Lifecycle Hooks”中简要描述。

只要容器达到ContainerCreated状态,此挂钩就会触发,例如容器完成拉动并完全初始化。然后,您可以使用钩子跳转到容器中并运行任意命令。

在我们的例子中,我可以创建一个PostStart事件,当触发时,使用正确的路径重建应用程序。

除非你创建了一个实际上没有运行任何东西的Docker镜像(这对我来说似乎不对,但是如果这被认为是一种好的做法让我知道),这确实需要一些重复的工作:停止应用程序,重新运行构建进程,并再次启动应用程序。

命令

根据下面的评论,此事件不一定会在正确的时间触发。这是另一种方法,可以保证工作(因此,优越)。

有用的Docker容器以服务应用程序的CMD上的某些变体结尾。您可以在Kubernetes中覆盖此运行命令,如文档的"Define a Command and Arguments for a Container"部分所述。

所以我在运行shell脚本的pod定义中添加了command,(1)使用正确的路径重建应用程序,作为pod的环境变量提供,以及(2)开始为应用程序提供服务:

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

像魅力一样工作。