繁体   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