使用docker对程序进行沙箱归档

使用docker对程序进行沙箱归档,docker,dockerfile,sandbox,Docker,Dockerfile,Sandbox,我想使用docker实现以下功能: 运行具有特定目录访问权限的程序,然后在运行后重置对该目录所做的所有更改。因此,我想创建一个docker映像,将所述目录复制到docker卷中,以便程序可以访问目录中的文件,但每次运行时目录的内容相同 然而,这似乎增加了很多开销——有没有其他更好的方法来实现所描述的目标 PS:我想测量程序的行为,但不是出于安全原因,即我信任程序 实际上,您不必进行复制,Docker正是这样做的:保留和放弃更改。卷是保存文件和/或在容器之间共享文件的一种方式,而不是丢弃它们 使用

我想使用docker实现以下功能:

运行具有特定目录访问权限的程序,然后在运行后重置对该目录所做的所有更改。因此,我想创建一个docker映像,将所述目录复制到docker卷中,以便程序可以访问目录中的文件,但每次运行时目录的内容相同

然而,这似乎增加了很多开销——有没有其他更好的方法来实现所描述的目标


PS:我想测量程序的行为,但不是出于安全原因,即我信任程序

实际上,您不必进行复制,Docker正是这样做的:保留和放弃更改。卷是保存文件和/或在容器之间共享文件的一种方式,而不是丢弃它们

使用docker build和Dockerfile构建映像后,映像将作为容器的起点。使用docker start时,将基于给定图像创建一个容器。容器运行一个名为入口点的程序,当它退出时,它所做的任何更改都将被丢弃docker容器rm,或者您可以从docker start的最后一个状态重新启动该程序。相同的图像作为只读层在所有运行的容器中共享,因此每个容器只存储程序产生的任何差异。在后台,docker使用overlay文件系统来激活它,所以如果您愿意,您也可以自己做

因此,简单的答案是:

创建包含未触及目录的映像 使用docker Run-rm运行映像。 或者,当容器与docker rm一起退出时,您可以自己使用just docker run和delete容器


每次运行docker时,程序都会看到未触及的目录,因为它存储在映像中。当程序退出时,任何更改都将被放弃。即使您并行运行两个容器,它们的更改也会被隔离。

您是否考虑过使用docker而不是docker?这似乎可以满足您的要求。如果我有多个要测试的程序,那么我必须创建多个包含该目录的映像?这是否会导致多个复制操作,每个程序/映像一个复制操作?在这种情况下,您可以先在没有程序的情况下构建一个基本映像,然后通过添加程序从基本映像构建多个不同的映像。基本映像将在第二级映像之间共享,容器将从第二级映像启动,甚至不知道它。