########  ##          ###     ######  ##     ## 
        ##     ## ##         ## ##   ##    ## ##     ## 
        ##     ## ##        ##   ##  ##       ##     ## 
        ########  ##       ##     ##  ######  ######### 
        ##        ##       #########       ## ##     ## 
        ##        ##       ##     ## ##    ## ##     ## 
        ##        ######## ##     ##  ######  ##     ##
          
              Bloatless Containerization Software
Plash is a small program to build and run containers in Linux. Essentially plash provides a handy interface to create chrooted proccesses without being root. It has its own image build instructions and container runtime. Plash is written in C using minimal dependencies that should allow it to compile and work for decades without any further changes.
cd $(mktemp -d) git clone git@github.com:ihucos/plash.git . make sudo cp dist/plash /usr/local/bin # uninstall sudo rm /usr/local/bin/plash
TODO: move stuff from github to here.
| usage: | Plash eval ... | 
| --hint | Write a hint for consumer programs | 
| --entrypoint | Hint default command for this build | 
| --entrypoint-script | Write lines to /entrypoint and hint it as default command | 
| --env | Use env from host when running image | 
| --env-prefix | Use all envs with given prefix when running image | 
| --eval-file | Evaluate file content as expressions | 
| --eval-github | Eval a file (default 'plashfile') from a github repo | 
| --eval-stdin | Evaluate expressions read from stdin | 
| --hash-path | Recursively hash files and add as cache key | 
| --import-env | Import environment variables from host while building | 
| --invalidate-layer | Invalidate the cache of the current layer | 
| --layer | Hints the start of a new layer | 
| --mount | Mount filesystem when running image ("src:dst" supported) | 
| --run | Directly emit shell script | 
| --run-stdin | Run commands read from stdin | 
| --write-file | Write lines to a file | 
| --write-script | Write an executable (755) file to the filesystem | 
| --from | Guess from where to take the image | 
| --from-docker | Use image from local docker | 
| --from-github | Build and use a file (default 'plashfile') from a github repo | 
| --from-id | Specify the image from an image id | 
| --from-lxc | Use images from images.linuxcontainers.org | 
| --from-map | Use resolved map as image | 
| --from-url | Import image from an url | 
| --apk | Install packages with apk | 
| --apt | Install packages with apt | 
| --defpm | Define a new package manager | 
| --dnf | Install packages with dnf | 
| --emerge | Install packages with emerge | 
| --npm | Install packages with npm | 
| --pacman | Install packages with pacman | 
| --pip | Install packages with pip | 
| --pip3 | Install packages with pip3 | 
| --yum | Install packages with yum | 
| --A | Alias for: --from alpine:edge --apk [arg1 [arg2 [...]]] | 
| --C | Alias for: --from centos:8 --yum [arg1 [arg2 [...]]] | 
| --D | Alias for: --from debian:sid --apt [arg1 [arg2 [...]]] | 
| --F | Alias for: --from fedora:32 --dnf [arg1 [arg2 [...]]] | 
| --G | Alias for: --from gentoo:current --emerge [arg1 [arg2 [...]]] | 
| --R | Alias for: --from archlinux:current --pacman [arg1 [arg2 [...]]] | 
| --U | Alias for: --from ubuntu:focal --apt [arg1 [arg2 [...]]] | 
| --f | Alias for: --from [arg1 [arg2 [...]]] | 
| --l | Alias for: --layer [arg1 [arg2 [...]]] | 
| --x | Alias for: --run [arg1 [arg2 [...]]] | 
$ plash build --from alpine --apk ttf-ubuntu-font-family gimp --layer --run 'touch /myfile' 112 $ plash run 112 gimp
plash --from-github ihucos/python -- python myscript.py
plash export-tar --from alpine | docker import - plash --from-docker busybox
plash -A py3-pip --layer --pip3 dotfiles -- dotfiles --sync
$ whoami myuser $ plash sudo whoami root
$ plash build --from alpine plash: fetching 100% plash: extracting... plash: ignoring dev file: ./dev/null (Operation not permitted) 2
$ plash run 2 printf 'hello from container\n' hello from container
$ mkdir ~/mydir $ cd ~/mydir $ plash run 2 pwd /home/myuser/mydir
$ plash build --from 2 --run 'touch /myfile' + touch /myfile --: 3
$ plash b run --from alpine --run 'touch /myfile' -- ls /myfile /myfile
$ plash -Ax 'touch /myfile' -- ls /myfile /myfile
$ plash -Ax 'touch /myfile' -lx 'touch /otherfile' -- ls /otherfile
$ plash b with-mount -A -- ls bin dev etc home lib media mnt proc root run sbin srv sys tmp usr var
$ plash b rm --from-github ihucos/python
$ cat /tmp/yapf #!/usr/bin/env plash --from-github ihucos/python --pip3 yapf --entrypoint /usr/bin/yapf $ /tmp/yapf myproject
#!/usr/bin/env plash
--from archlinux
--pacman gtk3 python-gobject
--layer
--entrypoint-script 
#!/usr/bin/env python
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
Gtk.init(None)
Hello = Gtk.MessageDialog(message_type=Gtk.MessageType.INFO,
                          buttons=Gtk.ButtonsType.OK,
                          text="Hello world!",
                          secondary_text="This is running inside a plash container.")
Hello.run()
$ plash eval --from ubuntu --apt python3-pip --layer --pip3 yapf -lx 'touch /foo' ### plash hint: image=9 apt-get update apt-get install -y python3-pip ### plash hint: layer pip3 install yapf ### plash hint: layer touch /fooLast updated: 2023-01-31