我正在使用Mac并想在我的docker容器中运行emacs。有没有一种解决这个问题的首选方法?在我的流程中,我得到了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的首选方法吗?
答案 0 :(得分:10)
为了编辑容器内的文件,通常最好在主机上使用卷和编辑器,正如Bryan所说。实际上,您永远不应该编辑不在卷中的文件,因为删除容器时您的更改将会丢失。
但是,在容器内运行编辑器甚至GUI应用程序是非常有用和有用的。为了运行emacs的命令行版本,我所要做的就是:
$ docker run -it debian /bin/bash
root@02bd877c1052:/# apt-get update && apt-get install -y emacs23-nox
root@02bd877c1052:/# emacs
我已经在Linux上本地运行boot2docker和docker测试了这个。我认为你的问题是因为emacs试图启动X版本的emacs,默认情况下它不会工作,因为XServer没有运行。
如果要在容器内运行GUI应用程序,可以选择以下几种方法:
请不要相信容器不应用于交互式应用程序。这样做有很多原因,包括安全性。 subuser project使用Docker来运行交互式应用程序,并详细说明为什么这是一个好主意。
答案 1 :(得分:10)
正如Adrian Mouat所提到的in his comment,只是这样做:
export TERM=xterm
并且您将能够运行emacs(但请注意,您始终必须双重输入C-p才能移至上一行,因为Docker)。
答案 2 :(得分:2)
在容器内运行编辑器并不是一个好主意。容器适用于服务,而非交互式应用程序。如果您尝试它,所有输入和输出将通过一个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 / webapp作为/ opt / webapp目录挂载到容器中。这对于测试非常有用,例如我们可以将源代码安装在容器中,并在我们更改源代码时查看我们的应用程序。
请注意,as from Docker 1.3 -v
开关也可以在外部Mac上使用。