通过API在ECS上安装目录?

这可能是一个serverfault的事情,但因为我试图通过API或以编程方式做到这一点,我会假设问题是为StackOverflow,直到我被告知,否则。

我试图在我正在开发的应用程序中用ECS取代Deis。 目前,应用程序本身能够在Deis上启动新的应用程序(运行Web应用程序的Docker容器),方法是使用部署密钥从我们的私人git repo中检查源代码,然后将所述代码推送到Deis端点(然后处理创build旋转docker集装箱等)。

尽pipe如此,戴斯还是相当不错的,所以我正在探索取代它。

ECS似乎是一个很好的select,通过使用Buildstep容器,我已经使用docker在命令行从我的私有存储库成功运行了类似heroku的代码部署。

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

docker run -d -v ~/.ssh:/root/.ssh -p 3000:3000 -e PORT=3000 -e GIT_REPO=private-repo-url.git tutum/buildstep /start web 

除了两件事之外,大多数都很好。 首先是我不知道调用任务创buildAPI时执行此操作的最佳方法。 根据我的理解,在ECS上注册一个带有卷和挂载点的任务是可能的,但是这个卷需要是运行任务的ECS集群主机上的一个卷(我可以使用这个确认),这不是在任务注册时间已知。 我能find的唯一例子是使用本地文件path。

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

另一部分是不太值得关注的,但理想情况下,一旦git repo pull完成,键不会停留在每个容器上。 我认为最简洁的方式来做这将取决于我如何完成第一个问题,但第二个问题是如何清理我的密钥,以便他们不会留在容器部署完成后

如何将我的部署密钥注入到容器中,或者可靠地映射容器在引导时可以附加的“密钥”目录

我会在用户数据中这样做。 无论如何都需要ECS的用户数据,以便实例可以join集群。 有这个钥匙可用(s3,无论),并在启动时把它拉下来。 说这进入/ opt / foo。 您的任务定义可以毫无问题地从主机映射/ opt / foo,因为集群中的每个主机都有和正在使用它。

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

这是一个单独的问题。 如果您的容器停止/启动,那么该密钥需要再次正确使用? 如果是这样,你不能清理它们,因为这个任务可能随时在不同的实例上启动。 如果您只需要一次,那么一旦部署完成,您可以让您的Docker容器的启动CMD运行一个命令来清除它。 这听起来很脆弱。 为什么不使用只读帐户,并提供用户名/密码,而不是使用git + ssh? 你可以通过env vars提供,而不需要做这个的一半。

你真的需要挂载一个目录吗? 如果在您所在地区可用,EFS可以成为您的ECS实施的通用文件存储的一个很好的解决scheme。

查看:

https://aws.amazon.com/blogs/compute/using-amazon-efs-to-persist-data-from-amazon-ecs-containers/

对于参考实现来说,尽pipe对于你正在尝试做的事情来说是过度的。