我可以通过挂载目录向 sbt-native-packager 构建的本地 Docker 容器提供 AWS 凭证吗
Posted
技术标签:
【中文标题】我可以通过挂载目录向 sbt-native-packager 构建的本地 Docker 容器提供 AWS 凭证吗【英文标题】:Can I provide AWS credentials via mounted directory to local Docker container built by sbt-native-packager 【发布时间】:2019-03-16 15:40:32 【问题描述】:我们有一些使用 sbt-native-packager 构建的 docker 镜像,需要与 AWS 服务交互。在 AWS 之外运行它们时,我们需要明确提供凭证。
我知道我们可以显式传递包含 AWS 凭证的环境变量。这样做会使我们的凭据保密变得复杂。一种选择是通过命令行提供它们,通常将它们存储到我们的 shell 历史记录中(是的,我知道这可以通过在命令的开头添加一个空格来避免,但这很容易忘记)并将它们置于更高的风险中意外复制/粘贴共享。或者,我们可以通过 env 文件提供它们。但这使我们有可能将它们检查到版本控制中或无意中将它们推送到另一台服务器。
我们发现理想的做法是将我们的本地 ~/.aws/
目录挂载到正在运行的 docker 容器用户的主目录中。然而,我们试图让它与 sbt-native-packager 镜像一起工作的尝试没有成功。
sbt-native-packager 镜像的一个独特细节(与我们的其他镜像相比)是它们是使用 docker 的 ENTRYPOINT 而不是 CMD 来启动应用程序的。我不知道这是否与问题有关。
所以问题是:是否可以通过在启动时通过命令行参数挂载 AWS 凭证文件夹来向 sbt-native-packager 创建的 docker 容器提供 AWS 凭证?
【问题讨论】:
【参考方案1】:我遇到的问题与权限有关。 .aws
文件在我的机器上的访问权限非常有限,并且 sbt-native-packager 映像中的默认用户是 daemon
。此用户在挂载到容器时无权读取我的文件。
我可以通过在我的 docker run 命令中添加以下标志来获得我想要的行为:-v ~/.aws/:/root/.aws/ --user=root
当我运行查看HOME
环境变量(挂载/.aws/
文件夹的位置)并尝试cat
挂载文件夹的内容时,我能够通过使用--entrypoint=ash
标志发现这一点。
现在我只需要了解以这种方式运行 docker 容器会导致哪些安全漏洞。
【讨论】:
【参考方案2】:我不完全确定为什么挂载 ~/.aws
会成为问题 - 通常它可能与该目录的读取权限以及主机系统和容器之间的不同 UID 有关。
也就是说,我可以提出几个解决方法:
使用环境变量文件而不是在命令行中明确指定它们。在docuer run
中,您可以通过指定--env-file
来执行此操作。对我来说,这听起来是最简单的方法。
挂载不同的凭据文件并提供AWS_CONFIG_FILE
环境变量以指定其位置。
【讨论】:
感谢有关 AWS_CONFIG_FILE 的提醒。当我尝试使用它但仍然无法正常工作时,我发现了如何进入正在运行的容器以查看发生了什么。不幸的是,当 SDK 无法访问这些文件时,没有记录任何消息。以上是关于我可以通过挂载目录向 sbt-native-packager 构建的本地 Docker 容器提供 AWS 凭证吗的主要内容,如果未能解决你的问题,请参考以下文章
如何将 socket.io 挂载到 fastapi 应用程序并向所有连接的客户端发送广播
从 child.vue 中的挂载向 parent.vue 发出值