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
latestdockerfiles/emacs26emacs25dockerfiles/emacs25testingdockerfiles/snapshotalpinedockerfiles/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- removeemacscontainerdocker restart emacs- restartemacscontainerdocker rmi -f jare/emacs- removejare/emacsimagedocker pull jare/emacs- get newerjare/emacsversiondocker 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/emacsin the runningemacscontainerdocker logs emacs- printemacscontainer'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


