我在docker上看到的一个相当普遍的设置是让容器旋转起来执行任务,然后退出。
这是我在docker-compose上经常执行的操作,其中我有一个节点容器来执行构建过程,并且在构建了静态文件后不需要保持运行。
在这些情况下,如果我查看docker-compose ps
的输出,而我的其他容器处于打开状态并暴露在端口上,则节点容器的状态将为“退出0”。
尽管在其他情况下如果我需要访问此容器,则它处于休眠状态,可以将其旋转。
将此设置转换为Kubernetes的好习惯是什么?
我最初的方法是将所有内容放置在一个Pod中,但是退出容器会导致CrashLoopBackOff,并且由于Pod重新启动策略,Pod会继续重新启动。 如果要保留此设置,则我只希望在其他容器之一发生故障时重新启动Pod。它已经将构建静态文件移动到其他容器可以访问的卷中。
该容器是否应移至另一个无法重启的容器中?似乎这样会使部署不必要地复杂化。
答案 0 :(得分:5)
通常,为了防止POD重新使用restartPolicy: Never
(more on Restart Policy)。
此外,对于要“完成”运行的事物,请使用名为Job
(more on Job)的k8s组件:
apiVersion: batch/v1
kind: Job
metadata:
name: <job_name>
spec:
template:
spec:
containers:
<...>
要运行Job直到第一次成功(exit code 0
),请设置restartPolicy: OnFailure
。
答案 1 :(得分:4)
一个执行构建过程的节点容器,一旦构建了静态文件,则无需保持运行状态
这听起来像是init container的定义:“它们总是运行到完成。每个组件必须在下一个组件开始之前成功运行。”
在部署规范的Pod模板部分中,您将有一个单独的initContainers:
部分,其中包含单独的仅生成容器。它的格式与包含主应用程序的containers:
节的格式完全相同,但是首先运行一次,直到完成一次。您可能需要在Pod的上下文中创建一个卷以与主容器共享内容,但这可能类似于emptyDir:
类型的pod,没有实际的持久存储。
如果您实际上是在运行诸如Webpack之类的工具来“构建”某种东西,该工具主要生成静态文件,那么最好还是将此过程移到Dockerfile中,这样您就可以运行未修改的映像而无需进行更多构建在部署时。