Dockerized Emacs with GUI(Mac, Windows, GNU/Linux and your browser)
Images are clickable
docker-x11-bridge + a web browser
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:
latest
dockerfiles/emacs26emacs25
dockerfiles/emacs25testing
dockerfiles/snapshotalpine
dockerfiles/alpine - Emacs build on Alpine Linux small (around 300mb uncompressed) but can be glitchy
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
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`
docker-x11-bridge
Also you can run it withPros:
- 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
- removeemacs
containerdocker restart emacs
- restartemacs
containerdocker rmi -f jare/emacs
- removejare/emacs
imagedocker pull jare/emacs
- get newerjare/emacs
versiondocker images -a
- list all imagesdocker ps -a
- list all containersdocker run ... jare/emacs
- run the default commanddocker run -ti ... jare/emacs /bin/bash
- start bashdocker exec emacs /usr/bin/emacs
- start/usr/bin/emacs
in the runningemacs
containerdocker logs emacs
- printemacs
container's logsdocker run ... -p 8080:8080 ... jare/emacs
- access container's server from localhost:8080docker 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