你在连接保持容器运行的bash实例时遇到了问题。
更详细地说,你正在按照以下方式运行容器:
$ docker run -dt --name test ubuntu bash
现在它应该正在运行,而不是已完成。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
f3596c613cfe ubuntu "bash" 4 seconds ago Up 2 seconds test
接下来,我正在尝试连接到保持容器运行的bash实例。像这样:
$ docker attach test
通过运行这个命令,我能够向stdin写入一些内容,但是没有结果跟随。我不确定bash是否接收到了我输入的行。
有没有其他方法来持续运行容器中的bash?
我知道,我可以运行一个不同的bash实例并使用它docker exec -it test bash。 但是更一般地说,是否有一种连接到在Docker容器中运行的进程的方法?
有时将正在容器内部运行的进程的会话保存下来可能很有用。
解决方案
感谢user2915097指出缺少的-i标志。
现在我们可以拥有持久的bash会话。例如,让我们设置一些别名,并在停止和重新启动容器后重用它们。
$ docker run -itd --name test ubuntu bash
要附加到 bash
实例,只需运行以下命令:
$ docker attach test
root@3534cbe1e994:/# alias test="Hello, world!"
要从容器中分离并不停止容器,请按Ctrl+p,Ctrl+q
然后我们可以停止和重新启动容器
$ docker stop test
$ docker start test
现在我们可以连接到相同的
bash
实例并检查我们的别名。$ docker attach test
root@3534cbe1e994:/# test
Hello, world!
一切都运作得很完美!
正如我在评论中指出的,这个用例可以是在Docker容器中运行一些交互式Shell,如bash
、octave
和ipython
,只需重新连接到同一个实例即可保留所有历史记录、导入、变量和临时设置。