无法连接到运行Docker容器的bash

8

你在连接保持容器运行的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+pCtrl+q

然后我们可以停止和重新启动容器

$ docker stop test
$ docker start test

现在我们可以连接到相同的bash实例并检查我们的别名。
$ docker attach test
root@3534cbe1e994:/# test
Hello, world!

一切都运作得很完美!

正如我在评论中指出的,这个用例可以是在Docker容器中运行一些交互式Shell,如bashoctaveipython,只需重新连接到同一个实例即可保留所有历史记录、导入、变量和临时设置。

2个回答

4

您的容器正在运行,正如您所见

  • 它出现在docker ps中,因此它是一个正在运行的容器
  • 它显示n秒

您使用-dt启动它,因此您希望它

分离(对于d) 分配tty(对于t)

但不需要交互式,因为您没有添加-i

通常,您几乎总是一起提供-it,可能是-idt

请参阅此线程

何时可以在Docker容器中使用“--interactive”而不使用“--tty”?

由于您想要bash,我认为您应该添加-i

我不确定为什么您要使用-d

通常它是

docker run -it --rm --name=mytest ubuntu bash

然后您可以进行测试


谢谢,加上“-i”解决了我的问题。一个可能的使用场景是使用分离的交互式容器来保持持久会话。例如,Bash实例具有所有历史记录和以前的别名,而不必将它们放入.bashrc中。实际上,我将尝试使用这种技术来拥有持久的Octave会话,因为它也是一个交互式shell。 - Ruslan Sakevych

1

容器的运行生命周期由其根进程决定,在您的示例中是bash。当您使用bash作为进程启动ubuntu容器时,bash立即退出,因为它没有任何东西来保持其运行。这就是为什么容器立即退出且没有任何内容可连接的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接