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

+0

Это не очень хорошая идея. Контейнеры хорошо работают для сервисов, а не для интерактивных приложений. Все входные и выходные данные мультиплексируются по каналу http из процесса (emacs) в Docker CLI через демона Docker. – Bryan

+0

Вы используете Boot2Docker? Что вы пытаетесь достичь, запустив emacs таким образом? – Bryan

+0

Спасибо @bryan. Я хочу отредактировать код, который был извлечен экземпляром Docker, чтобы помочь в разработке кода. например, команда Docker запускала «git clone repo ...» И я хочу отредактировать файлы, которые были клонированы. –

ответ

8

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

Однако вполне возможно и полезно запускать редакторы и даже графические приложения внутри контейнеров. Для того, чтобы запустить версию командной строки 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.

Если вы хотите запустить приложение с графическим интерфейсом внутри контейнера, у вас есть несколько вариантов:

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

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

+0

Спасибо! В вашем примере это «debian» новое имя контейнера? Или что-то особенное? Потому что, когда я следую тому, что вы сделали, emacs установлен. Но если я прикрепляюсь к существующему контейнеру (docker exec -it 0248677d59c2/bin/bash), он не может найти пакет emacs для установки –

+0

'debian' - это имя используемого изображения. Возможно, вы использовали 'ubuntu'. Вы запустили 'apt-get update'? –

+0

Я получил apt-get update. Файл докеров начинается с «FROM debian: jessie», поэтому я не думаю, что его ubuntu –

1

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

Как Docker say, объемы являются лучшим вариантом:

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

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

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

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

+1

Я действительно не вижу проблемы с использованием контейнеров для интерактивных приложений и регулярно делаю это сам. –

+0

Извините, я не должен был ниспровергать, поскольку ваш вопрос об использовании томов правильный, хотя я не согласен с утверждением об интерактивных приложениях. Видимо, я не могу изменить его сейчас! –

+0

Я не настолько глуп;) Мне не разрешили изменить свой голос, пока вы не отредактировали сообщение. –

9

Как Адриан Муит упоминается in his comment, просто сделать:

export TERM=xterm 

, и вы будете иметь возможность запускать Emacs (обратите внимание, однако, что вы всегда будете иметь двойной ввод Cp, чтобы перейти к предыдущей строке , потому что Докер).

+0

это сработало для меня, а emacs23-nox не сделал –

+1

Еще одна вещь, которую я делаю на Docker, - это последнее редактирование в emacs на моем рабочем столе, копирование всего файла в буфер обмена, а затем внутри контейнера файл 'cat>. txt', вставьте буфер обмена и введите Ctrl + D. – metakermit

+0

Это правильный ответ. Все остальные ответы заслуживают '/ dev/null' – nottinhill

Смежные вопросы