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

问题描述 投票:0回答:2

我需要能够重新启动/恢复容器到其原始图像状态。简单地做一个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”命令之上引入附加层的额外“开销”。

python docker
2个回答
3
投票

有关@larsks'评论和OkieOth's答案的其他信息:

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

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

来自:Best practices for writing Dockerfiles

一般准则和建议

Containers should be ephemeral

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


2
投票

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

# 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对容器状态的处理更加清晰。

© www.soinside.com 2019 - 2024. All rights reserved.