我需要能够将容器重新启动/恢复到其原始图像状态。简单地执行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”命令之上引入附加层的额外“开销”。
答案 0 :(得分:3)
容器被认为是短暂的,所以你已经做了正确的事情,这是:
stop
和remove
旧容器run
新的来自: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对容器状态的处理更加清晰。