当前位置: 首页 > 面试题库 >

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

法弘亮
2023-03-14
问题内容

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

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

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

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

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


问题答案:

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

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

为您提供有关该方法的一些指导原则/示例:

  • trap在这个SO答案中给出了一个这样的示例(在Bash中实现,即带有)。
  • 这篇博客文章中给出了另一个可能的示例(用Python实现)。

请注意,除了可以正常终止容器之外,您可能还需要设置restart策略,例如alwaysunless- stopped。例如,请参阅此codeship博客文章。

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

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

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



 类似资料:
  • 问题内容: 首先是第一件事。我的系统信息和版本: 容器中的进程变成僵尸之后,我无法停止容器。升级到docker 0.9.0后,我在服务器上看到大量僵尸。例: 我可以看到 没有在节点进程25332上调用wait()来保持僵尸存活。所以我检查了strace在做什么,它似乎卡在了。stract实际上一开始就卡住了,只是显示了这一点: 但是在我运行sudo docker kill 3da5764b7bc9

  • 本文向大家介绍Docker 在后台运行容器,包括了Docker 在后台运行容器的使用技巧和注意事项,需要的朋友参考一下 示例 要使容器在后台运行,请-d在容器启动期间提供命令行选项: 该选项-d以分离模式运行容器。它也等效于-d=true。 处于分离模式的容器停止时不能自动删除,这意味着不能将--rm选项与-d选项结合使用。

  • 问题内容: 是否可以备份正在运行的Docker容器?该命令适合这样做吗? 问题答案: 一位朋友发表了评论 您好Slava,很抱歉您的问题已关闭。作为记录,Slava谈论的是docker.io,这是Linux容器的运行时。是的,这是一种合适的方法。它将生成整个容器文件系统状态的压缩包,并将其转储到stdout上。所以 将产生可用的tarball。您可以使用以下命令重新导入压缩包 请注意,原始元数据(

  • 我想简单地启动一个docker容器,它执行一些最终启动JBoss的java代码。 这工作得很好,除了我不知道如何再次连接到容器并回到bash提示符。 这是我启动容器的方式: 这是runAutomate.sh 现在,我必须在最后做尾部,以在容器完成运行我的自动化代码后保持其运行。最终的结果是Jboss在正确配置我的应用程序的情况下运行。 现在,当我再次尝试连接到容器时,我只得到一个没有提示的空白屏幕

  • 问题内容: 我有一个来自docker网站官方指南的简单示例。 我运行以下命令: 然后从创建的容器中获取一些输出: 然后,我查找容器的运行过程: 接下来,我尝试杀死容器的第一个过程: 但是,在我做完之后,没有任何改变。进程仍然有效,并且每秒输出“ hello”。我怎么了 问题答案: 重现您的情况时,我会看到和之间的PID不同。当您执行命令时,将在容器内执行=>应使用容器的pid。否则,在这种情况下,

  • 问题内容: 我正在服务器上运行多个docker容器,并且需要对所有容器上的存储库执行git pull。 我试过使用此: 但是它会出错: 它曾经工作过,但是后来突然停止工作,没有明显原因(我没有更改任何docker配置) 注意:的输出仅是容器ID: 问题答案: 使用Docker exec可以一次在容器上运行该命令,但是从您要在所有正在运行的容器上运行该命令的问题出发,就可以了。 我假设git已经安装