无法附加到运行Docker容器的bash

时间:2017-04-26 04:46:41

标签: linux bash shell docker containers

连接到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实例并使用它docker exec -it test bash。但是更一般的是,有没有办法连接到在Docker容器中运行的进程?

有时保存在容器内运行的进程的会话非常有用。

感谢user2915097指出丢失的-i标志。

所以现在我们可以拥有持久的bash会话。例如,让我们设置一些alias并在停止并重新启动容器后重复使用。

$ docker run -itd --name test ubuntu bash

要附加到bash实例,只需运行

$ docker attach test
root@3534cbe1e994:/# alias test="Hello, world!"

要从容器中分离而不是停止容器,请按 Ctrl + p Ctrl + q < / p>

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

$ docker stop test
$ docker start test

现在我们可以附加到同一个bash实例并检查我们的别名

$ docker attach test
root@3534cbe1e994:/# test
Hello, world!

一切都很完美!

正如我在我的评论中指出的,用例可以在Docker容器中以bashoctaveipython运行一些交互式shell,持久化所有历史记录,导入,变量和临时设置 通过重新连接到同一个实例。

2 个答案:

答案 0 :(得分:3)

你的容器正在运行,它还没有完成,你可以看到

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

您使用-dt启动它,因此您需要它

分离(d) 分配tty(for t)

但不是互动的,因为您不添加-i

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

见这个帖子

When would I use `--interactive` without `--tty` in a Docker container?

如你想要bash,我认为你应该添加-i

我不确定您使用-d

的原因

通常是

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

你可以测试

答案 1 :(得分:0)

容器的运行生命周期由其根进程决定,在您的示例中为bash。当你用bash作为进程启动你的ubuntu容器时,bash会立即退出,因为它没有任何东西可以让它继续运行。这就是为什么容器会立即退出并且无法附加的原因。