- 背景:我使用
docker run -it ubuntu
. - 我想做什么:我想在该容器内持久地安装来自 repos 的任何软件(
gjiten
例如)。 - 问题:在
exit
ing 容器后,安装的软件消失了。 - 问题:如何
gjiten
在我的容器中持续安装软件(例如 )?
杂项
- Afaik 卷不起作用,因为我不知道
apt
在哪里安装软件包。(如果apt
允许指定目标目录,这将是最好的解决方案。) - 我知道我可以在 docker 卷中使用 appimages,但是我不能使用
apt
并且更新软件变得很痛苦。 - 我知道我可以在 docker 卷上创建一个 chroot,但事实证明这非常痛苦。
编辑:答案:
退出的 docker 容器仍然存在,并且容器内部的更改不会丢失。我为此创建了一个答案。
您需要创建一个 Dockerfile 并从现有映像编写您自己的容器脚本。语法是这样的。
您将需要 RTFM 才能完全理解它,因为除此之外还有更多内容。最好的学习方式是查看 dockerhub 和 github 上的任何项目。这样您就可以看到“成品”以及容器的制造方式。
HTH 一点点,s1mmel
这是一个活生生的例子。这是我不久前构建的唯一存储库中的 Dockerfile。一个 Minecraft papermc 服务器。这不会让你一路走好,但对于初学者来说,我认为它已经足够好了。
看一看
我想,我对 docker 环境的看法是不正确的,因此产生了这个问题。
重要的
来自已退出容器的信息不会丢失!已安装的程序即使在退出后仍然存在 *。因此,这个问题基本上已经过时了。
在下文中,我试图阐明 docker 在这方面的工作方式。
*这与 Kulfy 的评论“当您退出实例或终止 docker 服务时,除非在使用映像时提交更改,否则更改和文件将丢失。”的评论相反。
Docker 的一般工作原理
docker run ubuntu
从图像创建一个容器ubuntu
。docker ps -a
这将显示您甚至退出的容器。问题相关
docker run -it ubuntu
从图像创建一个容器ubuntu
并在 shell 中启动交互模式。touch aaa
或安装gjiten
)exit
在容器内键入,您将退出该容器内的终端 (TTY)。由于该终端是该容器的主要进程,现在退出,容器将退出(=关闭容器内的操作系统)。docker ps -a
现在运行,你仍然可以在那里看到你的容器。所有更改仍然有效;它只是暂时没有运行。docker container start -i [containerID]
(-i
用于交互) 重新启动容器(如“重新启动系统”)。ls
以查看您的文件aaa
是否仍然存在。docker ps
,它会向您显示当前正在运行的容器。顺便说一句:请注意,您需要创建一个容器
-it
才能-i
使用docker container start -i [containerID]
一种解决方案
如果可以访问主机,则一种解决方案可能是
commit
更改。不过,这将创建一个全新的图像。来自这里的说明:
root@9a20cddf27c0
例如容器内的右侧部分docker commit [container ID] [new image name]
道具:来自评论的@Kulfy。
我认为您需要掌握容器图像的概念。容器和容器映像之间有明显的区别。
每个容器都从静态图像运行。映像本身是一个压缩包,包含运行给定软件所需的一切(二进制文件、直接依赖项、第 3 方依赖项、配置文件、用户、文件权限等等)。
容器运行后,它创建的所有内容都是短暂的,并且用户数据会持久保存在容器外部的卷中。
如果您需要永久安装特定的库或包,则需要修改映像。在实践中,这意味着创建您自己的
Dockerfile
并继承FROM
您希望修改的基本映像。创建映像后,您可以运行基于它的容器。这些天官方文档很清楚:https ://docs.docker.com/get-started/part2/