杀死正在运行的Docker容器后进行清理

时间:2018-09-24 20:39:37

标签: linux docker

我的目标是编写一个运行python脚本的docker映像,该脚本会生成许多充满随机数的csv文件,一旦完成,这些文件将被写入外部存储驱动器,然后容器退出。假设它写入了很多这样的csv文件,以致它们无法存储到内存中。

我担心的是容器遇到错误并退出(或由用户退出)的情况​​,然后容器创建了一堆必须手动清理的垃圾文件。

第一个解决方案是将快速驱动器(如SSD)直接安装到容器中并对其进行写入。完成后,它将数据从此SSD传输到外部存储驱动器。一件不好的事情是,如果容器意外退出,它将在SSD上留下垃圾。

第二个解决方案是使用SSD创建一个卷,使用该卷启动一个容器,然后执行与第一个解决方案几乎相同的操作。在这种情况下,如果容器意外死亡,那么体积将如何变化?它也会自动退出吗?可以将其配置为自动退出从而删除已创建的任何垃圾吗?

如果您感到好奇,那么最终目标是将这些容器与某种编排系统一起使用。

2 个答案:

答案 0 :(得分:1)

  

我担心的是容器遇到错误并退出(或由用户退出),然后创建了一堆必须手动清理的垃圾文件的情况。

请注意,您可以将ENTRYPOINT Python脚本配置为自动执行必要的清理。

为您提供这种方法的一些指导原则/示例:

  • 我在this SO answer中给出了一个这样的示例(在Bash中实现,即带有trap)。
  • this blog article中给出了另一个可能的示例(在Python中实现)。

请注意,除了可以正常终止容器之外,您可能还需要设置restart策略,例如alwaysunless-stopped。例如,请参见this codeship blog article

  

第一个解决方案是将快速驱动器(如SSD)直接安装到容器中并对其进行写入。完成后,它将数据从此SSD传输到外部存储驱动器。一件不好的事情是,如果容器意外退出,它将在SSD上留下垃圾。

     

第二个解决方案是使用SSD创建一个卷,使用该卷启动一个容器,然后执行与第一个解决方案几乎相同的操作。在这种情况下,如果容器意外死亡,那么体积将如何变化?它也会自动退出吗?

尽管您提出的两种解决方案对于解决该线程的主要问题不是必需的,但我必须指出,通常,在生产中使用卷是最佳实践,而不是仅仅使用 bind-mount 。但是,当然,使用这两个方法(-v volume-name:/path或绑定安装-v /path:/path)中的任何一个总比根本不使用-v选项好,因为我记得直接在其中写入数据容器的可写层表示,如果从映像重新创建容器,则这些数据将丢失。

答案 1 :(得分:1)

  

我担心的是容器遇到错误并退出(或由用户退出),然后创建了一堆必须手动清理的垃圾文件的情况。

如果您将中间文件写入容器文件系统,而不是写入永久卷,则docker可以为您完成所有艰苦的工作。只需使用remove选项(--rm)运行容器。例如。如果您这样做:

docker run --rm -v /path/to/external/storage:/final/result your_image

然后,您的应用程序可以写入/ final / result以外的任何位置,并且在容器退出时(成功或任何其他错误情况),Docker守护程序会自动删除该容器。成功完成任务后,将内容写入/ final / result以在容器退出后保留。该路径已完全组成,您可能需要根据使用情况对其进行调整。

请注意,如果您在桌面环境(mac / windows)而不是本机linux上运行,则VM磁盘会随着使用情况扩展而不会随着删除文件而收缩,这是一个问题。这是VM文件系统的本质,该文件系统根据使用情况以及在Docker的控制范围之外进行分配。在这种情况下,您可能希望整个安装程序都使用外部卷运行,并配置入口点以清除容器上次运行后剩余的任何临时文件。

相关问题