2017-04-26 139 views
2

遇到了連接到bash實例並保持容器運行的問題。無法連接到運行Docker容器的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實例並使用它docker exec -it test bash。但更一般的是,有沒有辦法連接到在Docker容器中運行的進程?

有時,保存在容器內運行的進程的會話可能很有用。

SOLUTION

感謝user2915097爲指出缺少-i標誌。

所以現在我們可以有持久的bash會話。例如,讓我們設置一些alias並在停止並重新啓動容器後重新使用。

$ docker run -itd --name test ubuntu bash 

要附加到bash情況下只運行

$ docker attach test 
[email protected]:/# alias test="Hello, world!" 

從容器分離,而不是停止容器按按Ctrl + p按Ctrl + q

然後我們可以停止並重啓容器

$ docker stop test 
$ docker start test 

現在我們可以連接到同一個bash實例和檢查我們的別名

$ docker attach test 
[email protected]:/# test 
Hello, world! 

一切工作完美!

正如我已經指出了我的評論用例此只需 通過重新連接到相同的運行一些互動殼爲bashoctaveipython在泊塢容器堅持所有的歷史,進口,變量和臨時設置實例。

回答

3

您的容器運行,還沒有完成,你可以看到

    它出現在 docker ps
  • ,所以它是一個運行容器
  • 它顯示了n秒

你用-dt啓動它所以你想要它

detached(for d) 分配一個tty(對於t)

但不能互動,只要你不添加-i

通常情況下,你幾乎總是提供-it在一起,也可能是-idt

看到這個線程

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

,只要你想bash,我想你應該加-i

我不知道爲什麼你使用-d

通常它是

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

,你可以測試

+0

感謝,加入'-i'解決我的問題。分離交互式容器的一種可能用例是持久會話。例如。 bash實例具有所有歷史記錄和以前的別名,而不會將這些替換爲.bashrc。實際上,我將嘗試使用這種技術來保持Octave會話,因爲它也是一個交互式shell。 –

0

容器的運行生命週期取決於它的根進程,在你的例子中是bash。當你用bash作爲進程啓動你的Ubuntu容器時,bash會立即退出,因爲它沒有任何東西可以保持它運行。這就是爲什麼容器立即退出並沒有任何附加條件。

相關問題