将Docker容器重置/恢复到原始图像状态的最佳方法

我需要能够重新启动/恢复一个容器的原始图像状态。 简单地做docker restart将不起作用(例如在会话期间创build的文件仍然存在)。

目前我有以下的python脚本来完成这项工作:

 import subprocess # Stop and remove a named container if it exists (meaning is running or have exited). def resetContainer( imageName, containerName ): containerExists=subprocess.check_output(['docker', 'ps','-aqf name=%s' % CONTAINER_NAME]) if containerExists: print('Stop and remove container') subprocess.call(['docker', 'stop','%s' % CONTAINER_NAME]) subprocess.call(['docker', 'rm','%s' % CONTAINER_NAME]) return; resetContainer(IMAGE_NAME,CONTAINER_NAME) # Finally re-create it from image subprocess.call(['docker', 'run','-d','--name',CONTAINER_NAME,IMAGE_NAME,'tail', '-f','/dev/null']) 

但有没有比这更好的方法?

我看过: https : //docker-py.readthedocs.io/en/stable/containers.html

但是从我所能看到的情况来看,我最终会得到相同数量的行+在docker“本地”命令之上引入附加层的额外“开销”。

对@larsks的评论和OkieOth的回答的附加信息:

容器被认为是短暂的 ,所以你已经做了正确的事情,这是:

  1. stopremove旧的容器
  2. run一个新的

来自: 编写Dockerfiles的最佳实践

一般准则和build议

容器应该是短暂的

由Dockerfile定义的映像生成的容器应尽可能短暂。 “短暂的”,我们的意思是说,它可以被制止和摧毁,并build立一个新的,并以最小的设置和configuration

如果您使用普通docker工人或docker工人编写,那么您需要删除机器上可能存在的容器,并启动一个新的容器以获得新的副本。

 # stop a container docker stop CONTAINER_NAME # removes the container docker rm -f CONTAINER_NAME 

如果您的容器使用外部卷(在主机或其他容器中),则还需要将其移除。 如果您使用数据库,则可能是这种情况。

我在我的机器上使用docker堆栈。 这种方法不需要额外的依赖关系(与docker-compose相对),并为您完成一个完整的容器重置。

 # bring up a fresh, clean docker stack docker stack deploy -c "$composeFile" "$STACK_NAME" # halt and remove the existing containers docker stack rm $STACK_NAME 

Docker堆栈不会清除已安装的主机目录。 IMOdocker堆栈比纯docker堆栈有更清洁的容器状态处理。