2014-11-22 186 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