2014-11-22 13 views
13

Używam komputera Mac i chcę uruchomić emacs w moim kontenerze dokowania. Czy istnieje preferowany sposób rozwiązania tego problemu? W moim strumieniu dostaję stuc, ponieważ DISPLAY/TERM nie są ustawioneUruchamianie emacs w kontenerze dokowania

> 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? 

Co powinienem użyć do tset? Czy istnieje preferowany sposób uruchamiania emacs w kontenerze dokowania?

+0

To nie jest dobry pomysł. Kontenery działają dobrze dla usług, a nie dla aplikacji interaktywnych. Całe wejście i wyjście jest multipleksowane przez kanał http z procesu (emacs) do interfejsu Docker CLI za pośrednictwem demona Docker. – Bryan

+0

Czy używasz Boot2Docker? Co próbujesz osiągnąć, uruchamiając emacs w ten sposób? – Bryan

+0

Dzięki @bryan. Chcę edytować część kodu, który został sprawdzony przez instancję Docker, aby pomóc w opracowaniu kodu. np. Polecenie Dockera uruchomiło "git clone repo ..." I chcę edytować pliki, które zostały sklonowane. –

Odpowiedz

8

Aby edytować pliki wewnątrz kontenera, najlepiej jest używać woluminów i edytora na hoście, jak sugeruje Bryan. W rzeczywistości nigdy nie należy edytować pliku, który nie znajduje się w woluminie, ponieważ zmiany zostaną utracone po usunięciu kontenera.

Jednak całkiem możliwe i użyteczne jest uruchamianie edytorów, a nawet aplikacji GUI w kontenerach. Aby uruchomić wersję wiersza poleceń Emacsa, wszystko, co musiałem zrobić, to:

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

Przetestowałem to z boot2docker i doker działa natywnie na Linuksie. Myślę, że twój problem polegał na tym, że emacs próbował uruchomić wersję X emacsa, która nie będzie działać domyślnie, ponieważ nie działa XServer.

Jeśli chcesz uruchomić aplikację GUI wewnątrz kontenera, masz kilka możliwości:

  • Używaj VNC lub podobną
  • Wykorzystanie ssh -X zrobić Przekazywanie X (wymaga serwer X, takich jak xquartz)
  • Zamontuj xsocket wewnątrz pojemnika (znowu wymaga serwer X i nie jestem pewien, jak to będzie działać z xquartz, również istnieje kilka problemów z bezpieczeństwem wystawiając xsocket)

Nie wierz, że pojemniki nie powinny być używane w aplikacjach interaktywnych. Istnieje wiele powodów, aby to zrobić, w tym bezpieczeństwo. subuser project wykorzystuje Docker do uruchamiania aplikacji interaktywnych i szczegółowo opisuje, dlaczego może to być dobry pomysł.

+0

Dzięki! W twoim przykładzie jest "debian" nowa nazwa kontenera? Czy coś wyjątkowego? Ponieważ kiedy śledzę to, co zrobiłeś, emacs jest zainstalowany. Ale jeśli dołączę do istniejącego kontenera (doker exec -it 0248677d59c2/bin/bash) nie może znaleźć pakietu emacs do zainstalowania –

+0

'debian' to nazwa obrazu, którego używamy. Możliwe, że używasz 'ubuntu'. Czy uruchomiłeś 'apt-get update'? –

+0

Uruchomiłem aktualizację apt-get. Plik dokowania zaczyna się od 'Z debian: jessie', więc nie sądzę, że jego ubuntu –

1

Uruchomienie edytora wewnątrz kontenera nie jest dobrym pomysłem. Kontenery działają dobrze dla usług, a nie dla aplikacji interaktywnych. Jeśli spróbujesz, całe wejście i wyjście jest multipleksowane przez kanał http z procesu (emacs) do interfejsu Docker CLI za pomocą demona Docker. Także jeśli edytowane pliki są w warstwowym systemie plików kontenera, to dodatkowo zwiększa to obciążenie.

Jak Docker say woluminy są lepszym rozwiązaniem:

można również zamontować katalog z własnego hosta do pojemnika.

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

To będzie zamontowanie lokalnego katalogu,/src/webapp, do pojemnika jako katalogu/opt/webapp. Jest to bardzo przydatne przy testowaniu, na przykład możemy zamontować nasz kod źródłowy wewnątrz kontenera i zobaczyć naszą aplikację w pracy, gdy zmieniamy kod źródłowy.

Pamiętaj, że as from Docker 1.3 Przełącznik -v będzie również działał z zewnętrznego komputera Mac.

+1

Naprawdę nie widzę problemu z używaniem kontenerów dla aplikacji interaktywnych i regularnie robię to sam. –

+0

Przykro mi, nie powinienem był cenzurować, ponieważ Twój punkt widzenia na używanie woluminów jest poprawny, chociaż nie zgadzam się z oświadczeniem o aplikacjach interaktywnych. Wygląda na to, że nie mogę tego teraz zmienić! –

+0

Nie jestem aż tak głupi;) Nie mogłem zmienić mojego głosu, dopóki nie zredagowałeś postu. –

9

Adrian Mouat wspomniano in his comment, po prostu zrobić:

export TERM=xterm 

i będziesz w stanie uruchomić Emacs (uwaga jednak, że zawsze będziesz mieć do podwójnego wprowadzić Cp, aby przejść do poprzedniej linii , ponieważ Docker).

+0

to działało dla mnie, a emacs23-nox nie. –

+1

Kolejną rzeczą, którą robię w Dockerze coraz częściej, jest edycja w emacs na moim pulpicie, kopiowanie całego pliku do schowka, a następnie wewnątrz kontenera jest plik 'cat>. txt', wklej do schowka i wprowadź Ctrl + D. – metakermit

+0

To jest poprawna odpowiedź. Wszystkie inne odpowiedzi zasługują na '/ dev/null' – nottinhill

Powiązane problemy