我有一个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环境变量如何交互的内容。
3条答案
按热度按时间wdebmtf21#
让我们假设docker-compose文件和kubernetes以相同的方式运行,两者都获取一个现成的映像并基于它调度一个新的pod或容器。
默认情况下这个映像接受一组env变量,要发送这些变量:docker-compose以一种方式管理它们,而kubernetes以另一种方式管理它们。(语法问题)
因此,您可以在compose和kubernetes上使用相同的图像,但发送env变量的语法将有所不同。
如果你想让它们在任何部署和工具下都保持不变,你可以一直在映像本身中硬编码那些env变量,换句话说,在你用来构建映像的dockerfile中。
我不推荐这种方式ofc,它可能不适合你的情况下,你是使用预先建立的官方图像,但下面是一个例子,一个dockerfile与env包括。
如果您希望以更好的方式进行管理,您可以在您的docker-compose中使用.env文件,以便能够更新所有变量,特别是当您的compose有多个共享相同变量的应用程序时。
在Kubernetes端,您可以创建一个配置Map,将您的Pod链接到该配置Map,然后您可以仅更新配置Map的值。
https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/
还请注意,您可以直接从docker中使用的.env文件设置configmap中的值,请查看上面的链接。
t3psigkw2#
compose可以将docker compose文件转换为kubernetes资源:
https://kubernetes.io/docs/tasks/configure-pod-container/translate-compose-kubernetes/
krcsximq3#
docker-compose.yml
文件和Kubernetes YAML文件具有类似的用途;两者都解释了如何从Docker映像创建容器。在部署到Kubernetes时不会读取其中的配置,也不会对映像进行任何永久性更改。如果需要将某些内容设置为环境变量,但实际上独立于任何特定的部署系统,请在映像的Dockerfile中将其设置为ENV。
如果您不能以这种方式指定它(* 例如,*,数据库主机名和凭据),那么您需要将它包含在两个文件中,如您所示。密码可能来自Compose中的主机环境变量而不是KubernetesSecret。