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

标签 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

运行此命令我可以向标准输入写入一些内容,但没有结果。我不确定 bash 是否得到我输入的行。

是否有其他一些 bash 方法可以使容器保持运行?

我知道,我可以运行不同的 bash 实例并使用它 docker exec -it test bash。但更一般地说,有没有办法连接到在 Docker 容器中运行的进程?

有时保存在容器内运行的进程的 session 很有用。

解决方案

感谢 user2915097 指出缺少的 -i 标志。

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

$ 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!

一切正常!

正如我在我的评论用例中指出的那样,可以运行一些交互式 shell,如 bashoctaveipython Docker 容器保留所有历史记录、导入、变量和临时设置 通过重新附加到同一实例。

最佳答案

你的容器正在运行,它还没有结束,如你所见

  • 它出现在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

你可以测试

关于linux - 无法附加到运行 Docker 容器的 bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43625255/

相关文章:

java - java中的linux shell脚本

c++ - 在 WSL : configure_file Problem configuring file 上对 configure_file 的每次调用都失败

bash - Centos 7 创建服务以在无限循环上运行 shell 脚本

linux - 如何删除名称为 '' $'\r' 的文件?

linux - Grep 包含指定字符串的文件列表并获取包含文件名和所需数据的输出

linux - 如何在 bash 脚本中使用 'history-c' 命令?

linux - shell中source命令的问题

linux - 在 initramfs 脚本中修改/设置根设备

c - 多线程 C 应用程序框架或模式

linux - 如何让ec2实例长时间停止