Git 通过API在ECS上挂载目录?

Git 通过API在ECS上挂载目录?,git,docker,amazon-ecs,Git,Docker,Amazon Ecs,这可能是一个serverfault问题,但由于我试图通过API或其他编程方式来实现,所以我将假设问题是针对StackOverflow的,直到有人告诉我不是这样 我正在尝试在我正在开发的应用程序中用ECS替换Deis。应用程序本身目前能够在Deis上启动新的应用程序(运行web应用程序的docker容器),方法是使用deploy密钥从我们的私有git repo中检出源代码,然后将所述代码推送到Deis端点(Deis端点负责创建和启动docker容器等) 不过,Deis已经相当脆弱了,所以我正在探索

这可能是一个serverfault问题,但由于我试图通过API或其他编程方式来实现,所以我将假设问题是针对StackOverflow的,直到有人告诉我不是这样

我正在尝试在我正在开发的应用程序中用ECS替换Deis。应用程序本身目前能够在Deis上启动新的应用程序(运行web应用程序的docker容器),方法是使用deploy密钥从我们的私有git repo中检出源代码,然后将所述代码推送到Deis端点(Deis端点负责创建和启动docker容器等)

不过,Deis已经相当脆弱了,所以我正在探索替换它

ECS似乎非常适合,通过使用,我已经成功地使用docker在命令行上从我的私有存储库中运行了类似heroku的代码部署

为此,我必须将ssh密钥目录映射到容器中,作为run命令的一部分:

docker run -d -v ~/.ssh:/root/.ssh -p 3000:3000 -e PORT=3000 -e GIT_REPO=private-repo-url.git tutum/buildstep /start web
除了两件事,这基本上是好的。首先,我不知道在调用任务创建API时执行此操作的最佳方法。据我了解,在ECS上使用卷和装载点注册任务是可能的,但该卷需要是运行该任务的ECS群集主机上的卷(?我可以对此进行确认),这在任务注册时是未知的。我能找到的唯一示例是使用的本地文件路径

因此,第一个问题:如何将部署密钥注入容器,或可靠地映射容器在启动时可以附加的“密钥”目录


另一部分不太重要,但理想情况下,一旦git回购拉取完成,密钥不会留在每个容器上。我认为最干净的方法取决于我如何完成第一个问题,但第二个问题是如何清理我的密钥,使它们在部署完成后不会留在容器中如何将部署密钥注入容器,或者可靠地映射容器可以在启动时附加的“密钥”目录

我会在用户数据中这样做。无论如何都需要ECS的用户数据,这样实例才能加入集群。把这个钥匙放在某个地方(s3,随便什么),并在启动时把它取下来。假设这个进入/opt/foo。您的任务定义可以无问题地从主机映射/opt/foo,因为集群中的每个主机都有并正在使用它

如何清理密钥,使其在部署完成后不会保留在容器上


这是另一个问题。如果您的容器停止/启动,则该密钥需要再次可用,对吗?如果是这样,您就无法清理它们,因为该任务可能随时在不同的实例上启动。如果您只需要它一次,那么您可以让docker容器的startup CMD在部署完成后运行一个命令来清理它。然而,这听起来很脆弱。为什么不使用只读帐户并提供用户/密码,而不是使用git+ssh?您可以通过env-vars提供此功能,而无需完成其中的一半。

您真的需要挂载目录吗?如果您所在地区有EFS,那么EFS是为您的ECS实现提供通用文件存储的一个很好的解决方案

退房:


对于一个参考实现,尽管它对于您尝试执行的操作来说是多余的。

您现在如何在您的部署环境中解决相同的问题,您使用卷共享.ssh密钥,docker开箱即用不做任何清理。我今天没有解决它,我有一个完全不同的架构,我正在从中移动。谢谢,这是我在发布问题后开始研究的内容。很抱歉没有更新,但我会在找到最终解决方案后再次更新。我的想法是正确的,我还不确定您的问题的答案。我目前使用的是部署键,因为推送到docker容器的东西不一定都来自同一个用户。