Подтвердить что ты не робот

Запуск emacs в контейнере докера

Я использую Mac и хочу запускать emacs в контейнере докера. Есть ли предпочтительный способ решить эту проблему? В моем потоке я получаю stuc, потому что DISPLAY/TERM не установлены

> 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? Или есть предпочтительный способ запуска emacs в контейнере докеров?

4b9b3361

Ответ 1

Чтобы редактировать файлы внутри контейнера, обычно лучше использовать тома и редактор на хосте, как предлагает Брайан. Фактически, вы никогда не должны редактировать файл, который не находится в томе, поскольку ваши изменения будут потеряны при удалении контейнера.

Однако вполне возможно и полезно запускать редакторы и даже графические приложения внутри контейнеров. Чтобы запустить версию emacs из командной строки, все, что мне нужно было сделать, это:

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

Я протестировал это с помощью boot2docker и docker, работающих на Linux. Я думаю, что ваша проблема состояла в том, что emacs пыталась запустить X-версию emacs, которая не будет работать по умолчанию, поскольку XServer не работает.

Если вы хотите запустить GUI-приложение внутри контейнера, у вас есть несколько вариантов:

  • Используйте VNC или аналогичные
  • Использовать ssh -x для пересылки X (требуется XServer, например xquartz)
  • Установите xsocket внутри контейнера (снова требуется XServer, и я не уверен, как он будет работать с xquartz, также есть некоторые проблемы с безопасностью при экспонировании xsocket)

Не считайте, что контейнеры не должны использоваться для интерактивных приложений. Этому есть много причин, включая безопасность. Проект subuser использует Docker для запуска интерактивных приложений и подробно рассказывает о том, почему это может быть хорошей идеей.

Ответ 2

Как сказал Адриан Муат в своем комментарии, просто выполните:

export TERM=xterm

и вы сможете запускать emacs (обратите внимание, что вам всегда нужно дважды вводить C-p для перехода к предыдущей строке, потому что Docker).

Ответ 3

Запуск редактора внутри контейнера на самом деле не очень хорошая идея. Контейнеры хорошо работают для сервисов, а не для интерактивных приложений. Если вы попробуете, все входные и выходные данные будут мультиплексироваться по каналу http из процесса (emacs) в Docker CLI с помощью демона Docker. Кроме того, если файлы, которые вы редактируете, находятся внутри файловой системы с многослойной структурой, то это также добавляет дополнительные накладные расходы.

Как "Докер" говорит, тома - лучший вариант:

вы также можете установить каталог из своего хоста в контейнер.

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

Это приведет к установке локального каталога /src/webapp в контейнер в качестве каталога /opt/webapp. Это очень полезно для тестирования, например, мы можем монтировать наш исходный код внутри контейнера и видеть наше приложение на работе, когда мы меняем исходный код.

Обратите внимание, что как из Docker 1.3 переключатель -v также будет работать с внешним Mac.