当前位置: 首页 > 知识库问答 >
问题:

Docker中env-file的Kubernetes等价

龙新荣
2023-03-14

背景:

目前我们正在使用Docker和Docker Compose为我们的服务。我们已经将不同环境的配置外部化到定义应用程序读取的环境变量的文件中。例如prod.env文件:

ENV_VAR_ONE=Something Prod
ENV_VAR_TWO=Something else Prod

test.env文件:

ENV_VAR_ONE=Something Test
ENV_VAR_TWO=Something else Test

因此,在启动容器时,我们可以简单地使用prod.envtest.env文件:

docker run --env-file prod.env <image>

然后,我们的应用程序根据prod.env中定义的环境变量获取其配置。

问题:

  1. 有没有办法从Kubernetes中的文件中提供环境变量(例如定义pod时),而不是像这样硬编码它们:
apiVersion: v1
kind: Pod
metadata: 
  labels: 
    context: docker-k8s-lab
    name: mysql-pod
  name: mysql-pod
spec: 
  containers: 
    - 
      env: 
        - 
          name: MYSQL_USER
          value: mysql
        - 
          name: MYSQL_PASSWORD
          value: mysql
        - 
          name: MYSQL_DATABASE
          value: sample
        - 
          name: MYSQL_ROOT_PASSWORD
          value: supersecret
      image: "mysql:latest"
      name: mysql
      ports: 
        - 
          containerPort: 3306

共有2个答案

丘友樵
2023-03-14

Kubernetes(v1.6)的一个新更新允许您(多年前)所要求的内容。

现在可以在yaml文件中使用envfrom,如下所示:

  containers:
  - name: django
    image: image/name
    envFrom:
      - secretRef:
         name: prod-secrets

当开发秘密是您的秘密时,您可以通过以下方法创建它:

kubectl create secret generic prod-secrets --from-env-file=prod/env.txt`

其中txt文件内容是键值:

DB_USER=username_here
DB_PASSWORD=password_here

这些文档仍然是一大堆例子,我不得不在这些地方苦苦搜索:

  • 机密文档,搜索envfrom-显示此选项可用。
  • 等效的configmap文档显示了如何使用它的示例。
傅毅然
2023-03-14

您可以通过使用Secret或ConfigMap填充容器的环境变量。当您正在处理的数据是敏感的(例如密码)时使用Secrets,当不敏感时使用ConfigMaps。

在Pod定义中,指定容器应该从一个秘密中提取值:

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

请注意,此语法仅在Kubernetes1.6或更高版本中可用。在早期版本的Kubernetes上,您必须手动指定每个值,例如:

env: 
- name: MYSQL_USER
  valueFrom:
    secretKeyRef:
      name: mysql-secret
      key: MYSQL_USER

(注意env数组作为值)

并为每个值重复。

无论使用哪种方法,现在都可以定义两个不同的秘密,一个用于生产,一个用于开发。

dev-secret.yaml:

apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
type: Opaque
data:
  MYSQL_USER: bXlzcWwK
  MYSQL_PASSWORD: bXlzcWwK
  MYSQL_DATABASE: c2FtcGxlCg==
  MYSQL_ROOT_PASSWORD: c3VwZXJzZWNyZXQK

prod-secret.yaml:

apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
type: Opaque
data:
  MYSQL_USER: am9obgo=
  MYSQL_PASSWORD: c2VjdXJlCg==
  MYSQL_DATABASE: cHJvZC1kYgo=
  MYSQL_ROOT_PASSWORD: cm9vdHkK

并将正确的机密部署到正确的Kubernetes集群:

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

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

现在,每当一个Pod启动时,它就会从secret中指定的值填充它的环境变量。

 类似资料:
  • 我们正在将Gitlab用于CI/CD。我将包含我们正在使用gitlab ci cd文件的脚本 根据脚本,我们只是合并了脚本,以避免在部署时在阶段和开发中遇到冲突/冲突。之前,我们为每个环境(stage和developer)提供了每个docker文件。现在我想合并dockerfile,我也合并了,但dockerfile没有抓取。库伯内特斯发生冲突(管道成功后显示警告)。我不知道如何清除库伯内特斯的警

  • 问题内容: 作为python和docker的新手,我创建了一个小flask应用程序(test.py),该应用程序具有两个硬编码值: 我可以创建一个Docker映像并从以下Dockerfile运行一个容器: 如何在运行容器时为用户名和密码创建ENV变量并传递动态值? 问题答案: 在你的python代码中,你可以读取env变量,例如: 然后,当你运行容器时,可以设置以下变量: 这将在容器内设置env变

  • 问题内容: 假设我要结合这些命令 进入 并且想知道用vs 设置变量是否等效。 换句话说,Dockerfile中的这些命令之间有区别吗? 与 问题答案: 如问题684所示,图像之间将不会持续存在。(不要忘记,每个Dockerfile指令都会生成一个中间容器,并提交到中间映像中:该映像不会保留导出的值) 将: 从结果映像运行容器时,使用设置的环境变量将保留。 您可以使用查看值,并使用更改它们。 问题是

  • 问题内容: 我在本地使用Kubernetes开发的大多数教程都使用Minikube。在适用于Windows的Edge的最新Edge版本中,您还可以启用Kubernetes。我试图了解两者之间的区别以及应该使用的区别。 Minikube允许您选择所需的Kubernetes版本,Docker for Windows可以做到吗?我没有配置它的方法。 Minikube具有CLI命令以启用仪表板,堆,入口和

  • 有没有一种方法可以传递变量让我们假设在本例中,我想使用将动物列表传递到entrypoint.sh文件中 但我希望能够在运行容器时传递不同的动物,例如 运行docker run命令时如何传递参数? 目标是在使用docker run命令时使用该变量,并将它们插入到entrypoint.sh文件中 现在我在我的DockerFile中进行了硬编码。但是我希望能够在运行docker run命令时做到这一点,

  • 问题内容: 在Kubernetes minikube教程中,有以下命令可以使用Minikube Docker守护进程: 该命令的确切作用是什么? 问题答案: 该命令返回一组Bash环境变量导出,以配置您的本地环境以重新使用Minikube实例中的Docker守护程序。 通过此输出会导致bash评估这些出口并使它们生效。 您可以通过省略评估步骤并直接运行来查看将在您的Shell中执行的特定命令。但是