kubernetes不会覆盖在Dockerfile中设置的环境变量

时间:2017-07-13 08:35:44

标签: docker kubernetes

我的Dockerfile包含用于开发和测试场景的默认环境变量:

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中添加了更多内容。

2 个答案:

答案 0 :(得分:6)

您需要以正确的yaml格式声明所有变量 所以在这个例子中,mysql_password将覆盖变量,但mysql_password2不会覆盖,只有在未声明它时才会插入:

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

意思是如果它以" - "它会覆盖。否则它会将变量插入容器

答案 1 :(得分:0)

嗯,我可以建议一种更好的方法来存储和检索容器的秘密吗?

当您使用的数据敏感时,Kubernetes会为您提供Secrets的概念;如果不敏感,则为ConfigMaps

您可以在容器定义中指定容器应从下面的秘密中提取值(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

所以现在你可以有两个不同的秘密,一个用于刺激,一个用于测试

测试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>

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。