17

我做了以下操作并丢失了 Docker 容器中所有更改的数据。

  1. docker build -t <name:tag> .
  2. docker run *-p 8080:80* --name <container_name> <name:tag>
  3. docker exec(导入和处理一些文件,启动服务器来托管它们)

然后我想在不同的端口上运行它。docker stop&docker run不起作用。相反,我做到了

  1. docker stop
  2. docker rm <container_name>
  3. docker run(与之前相同的参数)

重新启动后,我看到 1-3 处容器中发生的更改消失了,不得不重新运行导入。

下次我该如何正确执行此操作?

4

2 回答 2

17

您需要做的是从您在更改后刚刚停止的容器中构建映像。因为您的旧命令仍在使用没有新更改的旧图像(您在容器中进行了更改,而您刚刚停止而不是在图像中)

docker commit --help

Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Create a new image from a container's changes

docker commit -a me new_nginx myrepo/nginx:latest 然后您可以使用刚刚构建的新图像启动容器

但是如果您不想使用所做的更改创建映像(例如您不想在映像中放置包含密码的配置),您可以使用卷挂载

docker run -d -P --name web -v /src/webapp:/webapp training/webapp python app.py

此命令将主机目录 /src/webapp 挂载到位于 /webapp 的容器中。如果路径 /webapp 已存在于容器的映像中,则 /src/webapp 挂载会覆盖但不会删除预先存在的内容。移除挂载后,即可再次访问内容。这与 mount 命令的预期行为一致。

管理容器中的数据

于 2016-12-09T19:09:10.443 回答
4

每次您执行此操作时,docker run它都会根据您的图像启动一个新容器。并且一旦容器启动,docker 允许您使用docker update. 因此,您应该将数据保存在需要在容器实例之间持久存在的外部卷中。例如

docker run -p 8080:80 -v app-data:/data --name <container_name> <name:tag>

可以根据自己的需要更改容器中的卷名 (app-data) 和挂载点 (/data)。然后当你销毁并重新启动一个新容器时,你可以在新容器中挂载相同的卷。

于 2016-12-09T19:04:34.030 回答