我对Docker非常陌生,所以这可能是一个愚蠢的问题,但这是可行的。
我有一个Python ETL脚本,基本上已经this tutorial之后打包在Docker容器中,然后使用云功能和云调度程序,使实例每小时启动一次,运行同步,然后关闭实例。
我遇到了一个问题,尽管在此过程运行了一段时间后,VM的硬盘空间已用完。该脚本不需要任何存储或状态持久性-它从外部系统提取任何状态数据,并且仅使用应该在计算机关闭时删除的临时文件。
这引起了特别的问题,我对脚本的更新停止工作,因为计算机没有空间下载最新版本的容器。
我猜想它是日志还是自动创建的文件,用于尝试保持状态-在Docker容器中还是在VM上。
我想知道是否可以让VM使用“ --rm”标志来运行实例,以便在完成后删除映像,这可以解决此问题。从理论上讲,这将确保我始终从最新图片入手。
问题是,我一辈子都找不到在实例设置中配置“ rm”选项的方法,而documentation for container options仅涵盖将参数传递给容器ENTRYPOINT而不是docker run选项docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
我觉得我要么缺少明显的东西,要么不打算以这种方式使用它。这是可以在Dockerfile中配置的东西,还是我必须首先设置虚拟机的另一种方式?
基本上,我只是希望将docker映像每次都重新拉动并运行,而不希望在VM上留下任何会慢慢用完空间的残留物。
此外,我知道Cloud Run可能在某些类似情况下也可以运行,但我需要脚本能够运行所需的时间(尤其是回填数据的开始时间),因此需要15分钟限制运行时会是一个问题。
任何建议将不胜感激!
答案 0 :(得分:0)
注意:我将其发布为答案,因为我需要更多空间而不是评论。如果有人觉得这不是一个好答案,并希望删除它,我将很高兴这样做。
回顾故事,我们配置了一个计算引擎来启动Docker容器。 Compute Engine运行容器,然后我们停止它。一个小时后,我们重新启动它,让它运行,然后再次停止它。这将持续到未来。我们似乎发现,与Compute Engine关联的磁盘已装满,最终导致损坏。这种想法是,包含在Compute Engine中的容器是在Compute Engine首次启动时创建的,然后每次重新启动时,它都被“重用”,而不是创建一个全新的容器实例。这意味着容器从一次运行到下一次运行所消耗的资源(例如磁盘存储)将继续增长。
我们希望发生的事情是,当Compute Engine启动时,它将始终创建一个全新的容器实例,而没有过去的历史/资源使用情况。这意味着我们不会随着时间而消耗资源。
在GCP之外实现此目的的一种方法是使用“ --rm”标志通过Docker启动容器。这意味着当容器结束时,它将被自动删除,因此在下次Compute Engine启动时将没有先前的容器可以启动。再次...这是一个回顾。
如果我们深入研究GCP计算引擎与容器相关的工作方式,则会遇到一个名为“ Konlet”(Konlet)的软件包。这是负责将容器加载到Compute引擎中的软件包。这似乎本身就是用Go编写的Docker容器应用程序。它似乎读取了与Compute Engine相关的元数据,并基于此元数据对Docker执行API调用以启动目标容器。首先看到的是,目标Docker容器的启动似乎没有通过简单的docker
命令行执行。这意味着我们不能“简单地”编辑脚本。
Konlet是开源的,因此从原则上讲,我们可以对其进行详细研究,看看是否有特殊的标志可以与--rm
等效。但是,我的近期建议是在Konlet GitHub网站上发布问题,并询问作者Konlet是否有一个--rm
等效选项,如果没有,可以添加一个(如果没有,则更高)水平思考)。
同时,让我为您提供一个故事的替代选择。如果我正确地听到了您的声音,那么您每小时都会执行一项工作来启动计算引擎,进行工作,然后关闭计算引擎。该计算引擎托管您的“泄漏的”泊坞窗容器。如果创建/销毁了计算引擎而不是启动/停止计算引擎,该怎么办?尽管创建/销毁步骤可能需要花费更长的时间,但是假设您每小时运行一次,那么一两分钟的延迟可能就不那么令人震惊了。