我有一个Flask web应用程序作为Docker映像运行,它被部署到运行在GKE上的Kubernetes pod上。在docker-compose中包含了一些应用程序所需的环境变量。像这样:
...
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 pod中?
我试着在Kubernetes和Docker文档和Google搜索中研究这个问题,我能找到的唯一解决方案是在deployment.yaml
中包含环境变量,但我想将它们保留在docker-compose.yaml
中,以便在本地运行容器。我找不到任何解释Docker容器环境变量和Kubernetes环境变量如何交互的内容。
Kompose可以将docker组合文件转换为kubernetes资源:
https://kubernetes.io/docs/tasks/configure-pod-container/translate-compose-kubernetes/
让我们假设docker-compose文件和kubernetes运行方式相同,两者都需要一个准备使用的映像,并基于它调度一个新的pod或容器。
默认情况下,这个镜像接受一组环境变量,发送这些变量:docker-compose以一种方式管理它们,kubernetes以另一种方式管理它们。(语法问题)
所以你可以在compose和kubernetes上使用相同的图像,但是发送env变量的语法会有所不同。
如果你想让它们存在,无论部署和工具,你总是可以硬编码这些环境变量在镜像本身,换句话说,在你用来构建镜像的dockerfile。
我不推荐这种方式,如果你使用的是预构建的官方镜像,它可能不适合你,但下面是一个包含env的dockerfile的例子。
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端,你可以创建一个配置映射,将你的pods链接到那个configmap,然后你可以只更新configmap的值。
https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/
kubectl create configmap <map-name> <data-source>
还要注意,你可以直接从你在docker中使用的.env文件中设置你的configmap中的值,查看上面的链接。
docker-compose.yml
文件和Kubernetes YAML文件有类似的用途;两者都解释了如何从Docker映像创建容器。但是,只有在运行docker-compose
命令时才会读取Compose文件;在部署到Kubernetes时不会读取配置,也不会对映像进行任何永久性更改。
如果某些东西需要设置为环境变量,但实际上与任何特定的部署系统无关,则将其设置为映像的Dockerfile中的ENV。
ENV VAR_1=foo
ENV VAR_2=bar
# and don't mention either variable in either Compose or Kubernetes config
如果你不能这样指定它(例如:,数据库主机名和凭据),那么您需要将其包含在两个文件中,如您所示。请注意,有些配置可能会非常不同;密码可能来自Compose中的主机环境变量,但可能来自Kubernetes Secret。