如何在Kubernetes窗格中使用Docker容器变量

k3bvogb1  于 2022-12-03  发布在  Kubernetes
关注(0)|答案(3)|浏览(191)

我有一个Flask Web应用程序作为Docker映像运行,它被部署到运行在GKE上的Kubernetes pod中。有一些应用程序所需的环境变量包含在docker-compose.yaml中,如下所示:

...
services:
  my-app:
    build: 
      ...
    environment:
      VAR_1: foo
      VAR_2: bar
...

我想将这些环境变量保存在docker-compose.yaml中,以便在必要时可以在本地运行应用程序。但是,当我使用Kubernetes部署进行部署时,pod中缺少这些变量,并引发错误。我找到的解决此问题的唯一方法是在deployment.yaml中添加以下内容:

containers:
      - name: my-app
        ...
        env:
          - name: VAR_1
            value: foo
          - name: VAR_2
            value: bar
...

是否有办法将这些环境变量的值直接从Docker容器映像迁移到Kubernetes窗格中?
我尝试在Kubernetes和Docker文档以及Google搜索中对此进行研究,我能找到的唯一解决方案是将环境变量包含在deployment.yaml中,但我希望将它们保留在docker-compose.yaml中,以便在本地运行容器。我无法找到任何解释Docker容器环境变量和Kubernetes环境变量如何交互的内容。

wdebmtf2

wdebmtf21#

让我们假设docker-compose文件和kubernetes以相同的方式运行,两者都获取一个现成的映像并基于它调度一个新的pod或容器。
默认情况下这个映像接受一组env变量,要发送这些变量:docker-compose以一种方式管理它们,而kubernetes以另一种方式管理它们。(语法问题)
因此,您可以在compose和kubernetes上使用相同的图像,但发送env变量的语法将有所不同。
如果你想让它们在任何部署和工具下都保持不变,你可以一直在映像本身中硬编码那些env变量,换句话说,在你用来构建映像的dockerfile中。
我不推荐这种方式ofc,它可能不适合你的情况下,你是使用预先建立的官方图像,但下面是一个例子,一个dockerfile与env包括。

FROM alpine:latest

# this is how you hardcode it
ENV VAR_1 foo

COPY helloworld.sh .

RUN chmod +x /helloworld.sh

CMD ["/helloworld.sh"]

如果您希望以更好的方式进行管理,您可以在您的docker-compose中使用.env文件,以便能够更新所有变量,特别是当您的compose有多个共享相同变量的应用程序时。

app1:
    image: ACRHOST/app1:latest
    env_file:
      - .env

在Kubernetes端,您可以创建一个配置Map,将您的Pod链接到该配置Map,然后您可以仅更新配置Map的值。
https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/

kubectl create configmap <map-name> <data-source>

还请注意,您可以直接从docker中使用的.env文件设置configmap中的值,请查看上面的链接。

krcsximq

krcsximq3#

docker-compose.yml文件和Kubernetes YAML文件具有类似的用途;两者都解释了如何从Docker映像创建容器。在部署到Kubernetes时不会读取其中的配置,也不会对映像进行任何永久性更改。
如果需要将某些内容设置为环境变量,但实际上独立于任何特定的部署系统,请在映像的Dockerfile中将其设置为ENV。

ENV VAR_1=foo
ENV VAR_2=bar
# and don't mention either variable in either Compose or Kubernetes config

如果您不能以这种方式指定它(* 例如,*,数据库主机名和凭据),那么您需要将它包含在两个文件中,如您所示。密码可能来自Compose中的主机环境变量而不是KubernetesSecret。

相关问题