alpine-make-rootfs icon indicating copy to clipboard operation
alpine-make-rootfs copied to clipboard

Make customized Alpine Linux rootfs (base image) for containers

= Make Alpine Linux RootFS :script-name: alpine-make-rootfs :script-sha1: 73948b9ee3580d6d9dc277ec2d9449d941e32818 :gh-name: alpinelinux/{script-name} :version: 0.6.1

ifdef::env-github[] image:https://github.com/{gh-name}/workflows/CI/badge.svg["Build Status", link="https://github.com/{gh-name}/actions"] endif::env-github[]

This project provides a script for building customized https://alpinelinux.org/[Alpine Linux] rootfs (a base image if you like) for containers. It’s quite simple (250 LoC of shell), fast and requires minimum dependencies (just common Linux tools).

TIP: Do you want to just quickly chroot into Alpine Linux, e.g. on CI? Check out https://github.com/alpinelinux/alpine-chroot-install[alpine-chroot-install]!

== Requirements

  • Linux system
  • http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html[POSIX-sh] compatible shell (e.g. Busybox ash, dash, ZSH, bash, …)
  • common userland with chroot, getopt, grep, sed, sha256sum, wget (e.g. from Busybox, GNU coreutils, …)
  • tar (full-blown)

== Usage

Read documentation in link:{script-name}[{script-name}]. See link:.github/workflows/ci.yml[] for GitHub Actions example.

You can copy link:{script-name}[{script-name}] into your repository or download it on demand, e.g.:

[source, sh, subs="+attributes"] wget https://raw.githubusercontent.com/{gh-name}/v{version}/{script-name}
&& echo '{script-sha1} {script-name}' | sha1sum -c
|| exit 1

== Examples

=== Installation Script in Heredoc

[source, sh]

sudo ./alpine-make-rootfs \ # <1> --branch v3.8 \ # <2> --packages 'ruby ruby-bigdecimal sqlite' \ # <3> --timezone 'Europe/Prague' \ # <4> --script-chroot \ # <5> example-$(date +%Y%m%d).tar.gz - <<'SHELL' # <6> # Copy some file from the repository root to the rootfs. install -D -m 755 examples/hello_world.rb /app/hello_world.rb

    # Install some dev packages and gem mailcatcher.
    apk add --no-progress -t .make build-base ruby-dev sqlite-dev
    gem install --no-document mailcatcher

    # Clean-up dev packages.  <7>
    apk del --no-progress .make

SHELL

<1> The script needs to create files owned by root or other users and optionally uses chroot (when --script-chroot is specified), so it must be run under root (e.g. using sudo). <2> Alpine branch (release) to install (see https://wiki.alpinelinux.org/wiki/Alpine_Linux:Releases[Alpine Releases]). <3> You can name packages to install into the chroot, in addition to base packages (see ALPINE_BASE_PKGS in link:{script-name}[{script-name}]). <4> You may specify timezone to set (default is UTC). <5> This flag tells that the installation script will be executed inside chroot with the rootfs as new root. Your current working directory is binded at /mnt inside the chroot and $PWD for the script is set to /mnt, so you can easily access files out of the chroot and copy them into the rootfs. <6> Installation script may be provided also via STDIN, using a convenient heredoc syntax. The script passed is executed using /bin/sh -e. <7> Note that it’s not needed to clean apk cache, this is done automatically.

=== Create Docker Base Image

Create your own (customized) up-to-date base image.

[source, sh]

sudo ./alpine-make-rootfs --branch v3.8 - | docker import -c 'CMD /bin/sh' - my/alpine:3.8

=== Create OCI Image

You can use simply shell script https://github.com/jirutka/sloci-image/[sloci-image] to pack the generated rootfs as a single-layer OCI image.

[source, sh]

sudo ./alpine-make-rootfs --branch v3.8 --script-chroot rootfs.tar.gz ./install.sh ./sloci-image --entrypoint /start.sh --port 80/tcp --tar rootfs.tar.gz alpine:3.8

== License

This project is licensed under http://opensource.org/licenses/MIT/[MIT License]. For the full text of the license, see the link:LICENSE[LICENSE] file.