在Docker容器中运行emacs

我正在使用Mac并想在Docker容器中运行emacs。 有没有一个首选的方法来解决这个问题? 在我的stream程中,我得到了stuc,因为DISPLAY / TERM没有设置

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

我应该用什么tset? 还是有一个首选的方式来运行Docker容器中的emacs?

为了编辑容器内的文件,正如Bryan所说,通常最好使用主机上的卷和编辑器。 事实上,不应该编辑不在卷中的文件,因为当容器被移除时,更改将会丢失。

但是,在容器中运行编辑器甚至GUI应用程序是非常有可能的。 为了运行命令行版本的emacs,我所要做的只是:

 $ docker run -it debian /bin/bash root@02bd877c1052:/# apt-get update && apt-get install -y emacs23-nox root@02bd877c1052:/# emacs 

我已经用boot2docker和docker在Linux上本地运行了。 我认为你的问题是因为emacs试图启动X版本的emacs,默认情况下它不会工作,因为没有运行XServer。

如果你想在一个容器中运行一个GUI应用程序,你有几个select:

  • 使用VNC或类似的
  • 使用ssh -x来执行X转发(需要xquartz等XServer)
  • 在容器中装入xsocket(同样需要一个XServer,我不确定xquartz是如何工作的,而且暴露xsocket也有一些安全问题)

请不要认为容器不能用于交互式应用程序。 这样做有很多原因,包括安全性。 子用户项目使用Docker来运行交互式应用程序,并详细说明为什么这可能是一个好主意。

正如Adrian Mouat 在他的评论中提到的那样:

 export TERM=xterm 

并且你可以运行emacs(注意,尽pipe如此,你将永远不得不双击Cp移到上一行,因为Docker)。

在容器中运行编辑器并不是一个好主意。 容器适用于服务,而不是交互式应用程序。 如果尝试,所有input和输出都将通过Docker守护程序通过进程(emacs)通过http通道复用到Docker CLI。 另外,如果您正在编辑的文件在容器的分层文件系统中,那么也会增加额外的开销。

正如Docker所言 ,卷是更好的select:

你也可以从你自己的主机上挂载一个目录到一个容器中。

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

这会将本地目录/ src / webapp挂载到容器中,作为/ opt / webapp目录。 这对于testing非常有用,例如,我们可以将源代码安装在容器中,并在更改源代码时查看我们的应用程序。

请注意, 从Docker 1.3开始 , -v开关也将从外部的Mac工作。