朋友们,我正在尝试实现一个 init 容器,它将检查 MYSQL 是否已准备好进行连接,我正在尝试为此使用 nslookup。重点是,如何通过变量传递dns?
它是这样工作的:
command: ['sh', '-c', 'until nslookup mysql-primary.default.svc.cluster.local;
do echo waiting for mysql; sleep 2; done;']
但不是这样:
command: ['sh', '-c', 'until nslookup $(MYSQL_HOST); do echo waiting for mysql; sleep 2; done;']
知道如何使第二个选项起作用吗?
答案 0 :(得分:2)
MYSQL_HOST
似乎是一个环境变量而不是命令。
$(MYSQL_HOST)
将在子 shell 中作为命令执行 MYSQL_HOST
(在这种情况下不起作用)。
您可能想改用 "${MYSQL_HOST}"
。
答案 1 :(得分:1)
问题是,$()
执行一个子shell 并尝试在那里评估一个推荐。您真正想要的是通过 ${}
进行变量扩展。
这里有一个工作示例:
一个带有 init-container 的 pod,带有一个 MYSQL_HOST
环境变量:
---
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod
spec:
containers:
- name: busybox-container
image: busybox
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: mysql-check
image: busybox
command: ['sh', '-c', 'until nslookup ${MYSQL_HOST}; do echo waiting for mysql; sleep 2; done;']
env:
- name: MYSQL_HOST
value: "mysql-primary.default.svc.cluster.local"
创建相应服务后,pod 启动:
kubectl create svc clusterip mysql-primary --tcp=3306
为了完整起见:服务的 YAML(在这种情况下不一定相关)
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: mysql-primary
name: mysql-primary
spec:
ports:
- name: "3306"
port: 3306
protocol: TCP
targetPort: 3306
selector:
app: mysql-primary
type: ClusterIP
status:
loadBalancer: {}