![重新执行已退出的 docker 会话](https://linux22.com/image/1556843/%E9%87%8D%E6%96%B0%E6%89%A7%E8%A1%8C%E5%B7%B2%E9%80%80%E5%87%BA%E7%9A%84%20docker%20%E4%BC%9A%E8%AF%9D.png)
我已经下载了 docker 镜像并使用-it
参数以交互方式运行它。但是缺少一些应用程序,我通过 安装它们apt-get
。问题是每次我退出会话时,我安装的所有内容都会被删除,下次我必须重新安装。我想也许使用选项在已挂载目录中安装应用程序可能会起作用,但由于该目录中已经有一些其他应用程序,所以我认为这可能不是理想的解决方案。有没有一种标准的方法来保存当前会话,也就是说保存我已安装的应用程序。那么对和和类似文件-v
的更改呢?有没有一种优雅的方法来保存它们? .bashrc
.bash_profile
更新:
这是我想要重新运行的会话及其容器 ID。有没有办法使用容器 ID 再次以交互方式运行它?
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
50e77c283ae9 shogun/shogun-dev "bash" 24 hours ago Exited (1) 4 hours ago dreamy_fermi
答案1
从你的问题中我看到你有两种方法可以解决这个问题:
- 从容器生成 Docker 镜像,其中包含您需要持久化的所有软件包和配置。这样,您无需在每次创建新容器时都安装软件包并进行配置
- 使用您需要安装的所有软件包从 Dockerfile 创建自定义 docker 镜像。运行容器时,您可以使用 映射自定义文件和持久数据存储
-v volume
。
让我们举一个例子来更清楚地说明这一点。
# docker run -it --name test_con ubuntu:16.04 /bin/bash
我将安装一些软件包,即 vim、bash-completion 和 wget。
root@9c67dc1776cd:/# apt-get update
root@9c67dc1776cd:/# apt-get install vim bash-completion wget
然后从这个容器创建一个新的docker镜像,我将其命名为test_con。为此,我们将使用命令选项commit。
# docker commit -m "updated packages" test_con ubuntu:v1
如果命令执行成功,您应该得到类似这样的输出。
sha256:cdf9dc8fe82407b49bae2a2840e7f59706ac84e9f6a0fff55a62afc7dd0db3c3
使用此命令确认是否确实创建了新容器:
# docker images
从中创建测试容器并检查 wget 是否存在。
# docker run --name test --rm -it ubuntu:v1
root@401345aecec5:/# which wget
/usr/bin/wget
对于第二种选择,你可以看看这个维基页面在 docker 命令上。这将帮助您在初始创建时自定义镜像。
答案2
Docker 的重点在于它不会改变。如果你想改变它,更新 Docker 映像。