Skip to content
This repository has been archived by the owner on Sep 25, 2022. It is now read-only.

JAremko/docker-emacs

Repository files navigation

Dockerized Emacs with GUI(Mac, Windows, GNU/Linux and your browser)

Images are clickable

https://i.imgur.com/rONW3c3.jpg https://i.imgur.com/mjl9ALQ.jpg https://i.imgur.com/RB46TA9.jpg

docker-x11-bridge + a web browser https://github.com/JAremko/docker-x11-bridge/raw/master/img/demoHD.jpg

Why?

  • Reap the benefits of Emacs and other GNU/Linux tools on Windows/MacOS machines
  • Use docker hub to auto-build your environment and store full backups for free
  • Build once and work with the same development environment everywhere
  • Run untrusted/risky code in the tunable sandbox with CPU/network/disk quotas
  • Try new tools, experiment and roll back changes when something goes wrong
  • Share your setup with others or extend someone else’s development environment
  • Run multiple Emacs instances on the same machine isolated
  • An easy way to swap Emacs version (emacs26,emacs25,emacs-snapshot) for debugging
  • Pause container to free resources temporarily
  • Checkpoint & Restore - maybe the fastest way to start a “heavy” environment
  • Friendly for networks with low upload speed/quotas

Tags:

If you need a different Emacs version/configuration checkout Silex/docker-emacs

How to use

First get docker for your OS. Then you can use one of the images as a base(FROM) for your Dockerfile. Simple example, Spacemacs distribution. It will allow you to install and backup additional software/package dependencies. With Dockerfile ADD instruction you can extract your .emacs.d from archives and remote repositories like GitHub using URL. Also you can simply run one of the images:

MacOS:

Get XQuartz

open -a XQuartz

In the XQuartz preferences, go to the “Security” tab and make sure you’ve got “Allow connections from network clients” ticked

ip=$(ifconfig en0 | grep inet | awk '$1=="inet" {print $2}')
xhost + $ip
docker run -ti --name emacs\
 -e DISPLAY=$ip:0\
 -e UNAME="emacser"\
 -e GNAME="emacsers"\
 -e UID="1000"\
 -e GID="1000"\
 -v <path_to_your_.emacs.d>:/home/emacs/.emacs.d\
 -v <path_to_your_workspace>:/mnt/workspace\
 jare/emacs emacs

source

other method

Windows

Get Cygwin with xinit, xorg-server and optionaly winpty(to run Emacs container with -t)

export DISPLAY=<your-machine-ip>:0.0
startxwin -- -listen tcp &
xhost + <your-machine-ip>
docker run --name emacs\
 -e DISPLAY="$DISPLAY"\
 -e UNAME="emacser"\
 -e GNAME="emacsers"\
 -e UID="1000"\
 -e GID="1000"\
 -v <path_to_your_.emacs.d>:/home/emacs/.emacs.d\
 -v <path_to_your_workspace>:/mnt/workspace\
 jare/emacs emacs

Or with -ti via winpty

winpty docker run -ti --name emacs\
-e DISPLAY="$DISPLAY"\
-e UNAME="emacser"\
-e GNAME="emacsers"\
-e UID="1000"\
-e GID="1000"\
-v <path_to_your_.emacs.d>:/home/emacs/.emacs.d\
-v <path_to_your_workspace>:/mnt/workspace\
jare/emacs emacs

source You can use @ninrod 's setup

GNU/Linux

UID and preferably UNAME should match the host's user id. Also make sure that $DISPLAY variable is set

docker run -ti --name emacs -v /tmp/.X11-unix:/tmp/.X11-unix:ro\
 -e DISPLAY="unix$DISPLAY"\
 -e UNAME="emacser"\
 -e GNAME="emacsers"\
 -e UID="1000"\
 -e GID="1000"\
 -v <path_to_your_.emacs.d>:/home/emacs/.emacs.d\
 -v <path_to_your_workspace>:/mnt/workspace\
 jare/emacs emacs

That's it! Now you should see Emacs window.

If it doesn't work

You may need to allow local connection for the user UNAME should match the hosts user id.

xhost +si:localuser:<UNAME>

Or allow local connection from the container's hostname(This should work with any UID)

xhost +local:`docker inspect --format='{{ .Config.Hostname }}' emacs`

source

Also you can run it with docker-x11-bridge
Pros:
  • Same client for GNU/Linux, Windows and MacOS + web browser
  • Persistent server (you can connect and disconnect without disrupting Emacs)
  • Interactive screen sharing demo
  • Use Emacs in web-browser (O_O) demo
Cons:
  • Lag spikes with some OSes
Basic docker commands to get you started:
  • docker rm -f emacs - remove emacs container
  • docker restart emacs - restart emacs container
  • docker rmi -f jare/emacs - remove jare/emacs image
  • docker pull jare/emacs - get newer jare/emacs version
  • docker images -a - list all images
  • docker ps -a - list all containers
  • docker run ... jare/emacs - run the default command
  • docker run -ti ... jare/emacs /bin/bash - start bash
  • docker exec emacs /usr/bin/emacs - start /usr/bin/emacs in the running emacs container
  • docker logs emacs - print emacs container's logs
  • docker run ... -p 8080:8080 ... jare/emacs - access container's server from localhost:8080
  • docker cp <from_my_local_machine_path> emacs:/<to_my_emacs_container_path>
  • docker cp emacs:/<from_my_emacs_container_path> <to_my_local_machine_path>
  • Manage data in containers with Docker volumes. Example: - docker volume create --name my-workspace - docker run ... -v my-workspace:/mnt/workspace ... jare/emacs - docker run ... -v my-workspace:/home/developer/workspace ... jare/vim-bundle