2014-11-22 405 views
13

我正在使用Mac並想在我的碼頭集裝箱中運行emacs。有沒有解決這個問題的首選方法?在我的流程中,我得到stuc因爲DISPLAY/TERM沒有設置在碼頭集裝箱中運行emacs

> docker exec -it c6a7a76db84c bash 
> sudo apt-get install emacs 
... 
> [email protected]:/var/log/apache2# emacs 
Please set the environment variable DISPLAY or TERM (see `tset'). 
> [email protected]:/var/log/apache2# tset 
tset: unknown terminal type unknown 
Terminal type? 

我應該用什麼tset?或者有一個首選的方式來在Docker容器中運行emacs?

+0

這不是一個好主意。容器適用於服務,而不是交互式應用程序。所有的輸入和輸出都通過Docker守護程序通過HTTP通道從進程(emacs)複用到Docker CLI。 – Bryan 2014-11-22 23:06:04

+0

你在使用Boot2Docker嗎?你想通過這種方式運行emacs來實現什麼? – Bryan 2014-11-22 23:08:31

+0

謝謝@ bryan。我想編輯一些由Docker實例簽出的代碼,以幫助開發代碼庫。 例如,Docker命令運行「git clone repo ...」 而我想編輯克隆的文件。 – 2014-11-22 23:50:51

回答

8

爲了編輯容器內的文件,通常最好在主機上使用卷和編輯器,就像Bryan所說的那樣。事實上,您不應該編輯不在卷中的文件,因爲當容器被移除時,更改將會丟失。

但是,在容器中運行編輯器甚至GUI應用程序是非常有可能的和有用的。爲了運行的emacs的命令行版本,所有我需要做的就是:

$ docker run -it debian /bin/bash 
[email protected]:/# apt-get update && apt-get install -y emacs23-nox 
[email protected]:/# emacs 

我已經boot2docker和碼頭工人在Linux上本地運行測試這一點。我認爲你的問題是因爲emacs試圖啓動X版本的emacs,默認情況下它不會工作,因爲沒有運行XServer。

如果你想運行一個容器內的GUI應用程序,你有幾個選擇:

  • 使用VNC或類似
  • 使用ssh -x做X轉發(需要的XServer如xquartz
  • 裝入容器(內xSocket的再次需要的XServer,我不知道它如何與xquartz工作,也有與露出xSocket的一些安全問題)

請不要相信容器不應該用於交互式應用程序。這樣做有很多原因,包括安全性。 subuser project使用Docker來運行交互式應用程序,並詳細說明爲什麼這可能是一個好主意。

+0

謝謝!在你的例子中'debian'是新的容器名稱?還是特別的東西?因爲當我遵循你所做的,emacs被安裝。但是,如果我附加到現有的容器(docker exec -it 0248677d59c2/bin/bash),它無法找到要安裝的emacs軟件包。 – 2014-11-23 22:52:56

+0

'debian'是我們正在使用的映像的名稱。你可能一直在使用'ubuntu'。你運行'apt-get update'嗎? – 2014-11-23 23:33:33

+0

我跑apt-get更新。 docker文件以'FROM debian:jessie'開頭,所以我不認爲它的ubuntu – 2014-11-23 23:45:52

1

在容器中運行編輯器並不是一個好主意。容器適用於服務,而不是交互式應用程序。如果嘗試,所有輸入和輸出都將通過HTTP進程(emacs)通過Docker守護程序複用到Docker CLI。此外,如果您正在編輯的文件位於容器的分層文件系統內,那麼也會增加額外的開銷。

由於Docker say,卷是一個更好的選擇:

您還可以從您自己的主機掛載目錄到容器中。

$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py 

這將安裝到本地目錄,/ src目錄/ Web應用程序,放入容器作爲到/ opt/webapp目錄。這對於測試非常有用,例如,我們可以將源代碼安裝在容器中,並在我們更改源代碼時查看我們的應用程序。

請注意,as from Docker 1.3-v交換機也將從外部的Mac工作。

+1

我真的沒有看到使用容器進行交互式應用程序的問題,並且自己定期這樣做。 – 2014-11-23 16:06:06

+0

對不起,我不應該因爲你關於使用卷的觀點是正確的,但我不同意有關交互式應用程序的陳述。顯然我現在不能改變它! – 2014-11-23 16:44:17

+0

我並不那麼愚蠢;)在編輯帖子之前,我不允許改變我的投票。 – 2014-11-23 17:08:56

9

阿德里安Mouat提到in his comment,只是做:

export TERM=xterm 

,你就可以運行的Emacs(注意,雖然,你會永遠擁有雙輸入Cp將光標移動到上一行,因爲Docker)。

+0

這對我有用,emacs23-nox沒有 – 2017-05-18 10:19:24

+1

我在Docker上做的另一件事是在我的桌面上編輯emacs,將整個文件複製到剪貼板,然後在容器內執行'cat>文件。 txt',粘貼剪貼板並輸入Ctrl + D。 – metakermit 2017-05-19 08:57:46

+0

這是正確的答案。所有其他答案都值得'/ dev/null' – nottinhill 2017-09-27 15:50:49