问题描述
使用Azure,并且在一个Alpine Linux Docker容器中打包了一个相当简单的Unix shell脚本。目前,一个虚拟机(VM)通过cron定时运行这个脚本。脚本的运行步骤包括登录到Docker、拉取镜像以及运行容器。用户希望不再使用虚拟机,而是使用Azure服务,特别是通过Azure容器实例(Azure Container Instances,ACI)按计划运行容器。用户的动机是不想维护和支付虚拟机的费用。
解决方案
请注意以下操作可能受版本变化影响,请在实施前查看相关文档。
方案1:使用Azure容器实例(ACI)
Azure容器实例(ACI)是一个不错的选择,它允许你直接在Azure上运行容器,无需管理虚拟机。而且,ACI提供按秒计费,只需支付容器实际使用的时间。
1. 使用Azure CLI(az
命令)或Azure Cloud Shell,在命令行中创建并运行容器。可以参考Azure Container Instances快速入门文档。
2. 若要按计划运行容器,你可以考虑使用Azure Functions。Azure Functions是一个无服务器计算服务,支持多种语言,包括Bash和PowerShell。你可以创建一个定时触发的Azure Function,然后在其中运行容器创建命令。
3. 如果你想继续使用Docker容器,而不想运行虚拟机或学习Kubernetes,ACI是一个很好的选择。
方案2:使用Azure逻辑应用(Azure Logic Apps)
除了Azure函数,Azure逻辑应用(Azure Logic Apps)也是一个可以用来运行计划任务的选择。它可以用来触发和协调各种Azure服务和外部服务的自动化工作流。你可以创建一个逻辑应用,定期运行容器创建命令,实现类似的功能。
请注意,这些方案都能帮助你摆脱维护虚拟机的负担,实现按计划运行Docker容器的需求。在实际操作中,你可以根据你的具体场景选择最适合的方法。
更新: 截至2019年1月,Azure逻辑应用已经可以用于运行计划任务,取代了Azure Scheduler(Azure计划任务)功能。详情请参考Azure逻辑应用文档。
评论:
1. 我之前不知道我可以在Azure Functions中使用PowerShell或Bash!谢谢。
2. 是的,你可以从Azure Functions中运行任何可执行文件,而且在这个概述文档中明确提到了Bash。如果需要调用PowerShell模块,可以查阅这篇博客。
3. 使用云函数(例如Azure Functions、AWS Lambda等)运行安装脚本来配置云服务(例如设置新的云环境)是很常见的。因此,你可以期望所有无服务器服务和框架都支持运行Bash或类似的脚本。传统上,你会设置一个“控制主机”服务器来运行所有环境的设置。使用无服务器运行所有这些脚本意味着没有需要支付的主机。控制服务器如果被黑客入侵,会泄露你的环境地图、旧脚本以及可能的缓存密码。无服务器Bash更安全。
4. 并不是所有的无服务器(Serverless)服务都支持Bash。事实上,AWS Lambda只通过自定义Layers支持Bash,这是在2018年底添加的功能。你可以使用这个开源Layer来简化Bash的运行。一般来说,无服务器/Serverless服务支持特定的语言,一些提供者可以通过扩展来实现额外支持,例如AWS有Layers,Google有一个允许任何Docker容器运行的无服务器服务。
5. 为了简化,如果你不想使用Layers,你可以编写一个运行Bash的Node/Python Lambda,而不使用Layers,例如lambdash。