将docker容器重置/恢复为原始映像状态的最佳方法

时间:2017-12-20 12:29:02

标签: python docker

我需要能够将容器重新启动/恢复到其原始图像状态。简单地执行docker restart将无效(例如,在会话期间创建的文件等仍然存在)。

目前我有以下用于完成工作的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“native”命令之上引入附加层的额外“开销”。

2 个答案:

答案 0 :(得分:3)

@larsks'评论和OkieOth's回复的其他信息:

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

  1. stopremove旧容器
  2. run新的
  3. 来自:Best practices for writing Dockerfiles

      

    一般指导方针和建议

         

    容器应该是短暂的

         

    Dockerfile定义的图像生成的容器应尽可能短暂。 通过“短暂的”,我们的意思是它可以被停止和销毁,并且建立一个新的,并且绝对最少的设置和配置

答案 1 :(得分:2)

如果您使用普通泊坞窗或泊坞窗组合,则需要删除计算机上可能存在的容器并启动新容器以获取新副本。

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

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

我在我的机器上使用docker stack。这种方法不需要额外的依赖(与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堆栈不会清除已挂载的主机目录。 与纯粹的docker run相比,IMO docker stack对容器状态的处理更加清晰。