阅读《Docker 从入门到实践》时,读到“进入容器”这一章节,有两个主要 的命令,分别是:
docker attach
docker exec
其中提到一句话:
注意: 如果从这个 stdin 中 exit,会导致容器的停止。
一、为什么stdin 中 exit会导致容器的停止呢?
docker attach 和docker exec 都是和容器交互的命令,但是交互的本质是不一样的。
docker attach
如果用docker attach 和容器进行交互,那么,意味着会将标准的输入、输出以及错误流都附加到正在运行的容器的主进程上。它的好处是,通过这个命令可以与容器的主进程进行直接的交互,就像我们正在容器的内部运行命令一样。
如果我们要退出与这个容器的交互,按Ctrl+C
会向容器的主进程发送 SIGINT
信号,此时可能会导致容器的停止。
建议的操作是按下 Ctrl+P
,然后按下 Ctrl+Q
,即可安全退出。
docker exec
使用docker exec命令,那么会在当前运行的容器中,创建一个新的进程。它不会影响主进程。
二、既然docker attach会导致容器停止,那么直接使用docker exec来替代docker attach 岂不更好?
docker attach 和docker exec有各自的应用场景。使用docker attach 进行快速的查看输出或者进行简单的调试,还是十分方便的。它适用于短时间以及简单的的容器交互操作。
相反,如果是长时间的交互或者比较复杂的操作,那么最好的还是使用docker exec,重新创建一个容器进程。
PS:
写到这里,让我想起来,十年前写PHP代码的时候,技术leader给了我们线上主代码库的全权限。有一次加班,我一不小心把代码库上的代码删了。当时我的内心是无比惶恐的。
没想到,技术leader得知后,只是略微的愣了一会,就跟我说:没事,你先回家吧,我来处理。
最后,代码库恢复了。这件事也以我给全组人道歉买零食结束。
到现在,我都一直感激这位leader对我的善意。