docker-x11-bridge + a web browser
- 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
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
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:
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
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
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.
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`
Also you can run it with docker-x11-bridge
- 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
- Lag spikes with some OSes
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