如果我对您的理解正确,这些是您正在寻找的一些方法:
在您的情况下,您想使用PostStart
这个钩子在容器创建后立即执行。但是,不能保证钩子会在容器 ENTRYPOINT 之前执行。没有参数传递给处理程序。
挂钩处理程序实现
容器可以通过实现和注册该钩子的处理程序来访问该钩子。可以为容器实现两种类型的钩子处理程序:
pre-stop.sh
Exec -在 Container 的 cgroup 和命名空间内执行特定命令,例如 . 命令消耗的资源计入容器。
- HTTP - 针对容器上的特定端点执行 HTTP 请求。
您pod
可能类似于以下示例:
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo-container
image: nginx
lifecycle:
postStart:
exec:
command:
- "sh"
- "-c"
- >
curl -k -i -X POST --url https://localhost:7001/services/ --data 'name=hello-world1' --data 'host=service-helloworld' --data 'port=80';
curl -k -i -X POST --url https://localhost:7001/services/hello-world/routes --data 'paths=/hello-world' --data 'methods[]=GET'
一个 Pod 可以有多个容器在其中运行应用程序,但它也可以有一个或多个 init 容器,这些容器在应用程序容器启动之前运行。
初始化容器与普通容器完全一样,除了:
- 初始化容器总是运行到完成。
- 每个 init 容器必须在下一个启动之前成功完成。
这是来自docs的示例:
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']