kubernetes并不重写在Dockerfile中设置的环境variables

我的Dockerfile包含开发和testing场景的默认环境variables:

ENV mysql_host=mysql \ mysql_user=app \ mysql_password=password \ 

而我的k8s yaml包含一个env指令:

 spec: containers: env: - name: "mysql_password" value: "someotherpassword" name: "mysql_host" value: "someotherhost" name: "mysql_user" value: "someotheruser" 

但当我进入我的运行容器与

 kubctl exec -it service -- /bin/bash 

我仍然看到“密码”作为mysql_password。

编辑:从k8s yaml补充更多的完整性。

你需要以正确的yaml格式声明所有的variables,所以在这个例子中,mysql_password将会覆盖这个variables,但是mysql_password2不会覆盖,只有当它没有被声明时才会被插入:

 spec: containers: env: - name: mysql_password value: "someotherpassword" name:mysql_password2 value: "password" - name: override_password value: password3 

这意味着如果它以“ – ”开始,它将被覆盖。 否则会将variables插入到容器中

嗯,我可以build议一个更好的方法来存储和检索你的容器的秘密?

当你使用的数据是敏感的时候,Kubernetes为你提供了秘密的概念,而当它不是时,它提供了ConfigMaps 。

你可以在你的pod定义中指定容器应该从下面的秘密(Kubernetes 1.6+)

 apiVersion: v1 kind: Pod metadata: labels: context: docker-k8s-lab name: mysql-pod name: mysql-pod spec: containers: - image: "mysql:latest" name: mysql ports: - containerPort: 3306 envFrom: secretRef: name: mysql-secret 

所以现在你可以拥有2个不同的秘密,一个用于testing,一个用于testing

testingsecret.yaml:

 apiVersion: v1 kind: Secret metadata: name: mysql-secret type: Opaque data: MYSQL_USER: <user> MYSQL_PASSWORD: <password> MYSQL_DATABASE: <database> MYSQL_ROOT_PASSWORD: <root_password> 

PROD-secret.yaml:

 apiVersion: v1 kind: Secret metadata: name: mysql-secret type: Opaque data: MYSQL_USER: <user> MYSQL_PASSWORD: <password> MYSQL_DATABASE: <database> MYSQL_ROOT_PASSWORD: <root_password> 

现在,您可以将秘密部署到相应的群集中

 kubectl config use-context test kubectl create -f dev-secret.yaml kubectl config use-context prod kubectl create -f prod-secret.yaml 

现在,当你的Pod开始的时候,它将从秘密中的值中填充env。