我们将一个应用程序(用Node.js编写)停靠,这个应用程序需要在运行时访问一些敏感数据(不同服务的API令牌),我找不到任何推荐的方法来处理它。
一些信息:
我可以想到一些不同的方法,但它们都有一些缺点:
答案 0 :(得分:3)
我过去曾使用你的选项3和4来解决这个问题。重新说明/详细说明:
在图像中创建一个链接到主机系统中目录的卷,并通过SSH手动复制凭据,就像我们现在正在做的那样。
我使用配置管理(Chef或Ansible)在主机上设置凭据。如果应用程序采用需要API令牌或数据库凭据的配置文件,我使用配置管理从模板创建该文件。 Chef可以从加密的数据包或属性中读取凭据,在主机上设置文件,然后像您描述的那样使用卷启动容器。
请注意,在容器中,您可能需要一个包装器来运行该应用程序。包装器将配置文件从任何卷安装到应用程序所需的任何位置进行复制,然后启动应用程序。
将信息作为环境变量传递。但是,我们现在有5对不同的API凭证,这使得这有点不方便。但最重要的是,我们需要在配置脚本中保留敏感信息的另一个副本(将执行以运行Docker镜像的命令),这很容易产生问题(例如,git中意外包含的凭据等)。
是的,使用-e key=value
语法传递一堆env变量很麻烦,但我喜欢这样做。请记住,变量仍然可以访问具有Docker守护程序访问权限的任何人。如果以编程方式编写docker run
命令,则更容易。
如果没有,请使用here in the Docker docs所述的--env-file
标记。使用key = value对创建文件,然后使用该文件运行容器。
$ cat >> myenv << END
FOO=BAR
BAR=BAZ
END
$ docker run --env-file myenv
如上所述,可以使用chef / config管理创建myenv
文件。
如果您在AWS上托管,可以在此处使用KMS。保留通过KMS加密的env文件或配置文件(传递到卷中的容器)。在容器中,使用包装器脚本调用KMS,解密文件,将其移入以放置并启动应用程序。这样,配置数据不会在磁盘上公开。