我有一个基于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初始化时定义路径。这可能吗?
答案 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"]
像魅力一样工作。