Creating abstracted Dockerfile is something I really wish existed. Every time,
I write a Dockerfile for a specific base image I must specify the correct
package manager command. I must call apt-get or apk or yum or any other
call for the package manager. This is unfortunately, not very reusable.
I am comparing this to many years of experience with salt-stack which includes
a great wrapper around many common Linux package managers. This spares the
details of distinguishing between apt, apk or yum and dnf, you just
write pkg.install and you get your packages installed.
Here is a simple M4 schema how to achieve this abstraction. A better
solution will probably involve Jinja2 templates ...
This can spare you the need to remember which package manager you need to use
in which Docker image. Here is a very quick intro, how to this.
First create an m4 template:
$ cat Dockerfile.in
FROM ifdef(`ALPINE', alpine, ubuntu)
MAINTAINER Oz N Tiram <oz.tiram@gmail.com>
RUN ifdef(`ALPINE', apk add --update --no-cache,
apt-get update && apt-get install -y) curl tar xz bash
Now, create a simple Makefile:
$ cat Makefile
ALPINE ?=
ifdef ALPINE
USE_ALPINE := -DALPINE
endif
dockerfile:
@m4 $(USE_ALPINE) Dockerfile.in
Now you can create Dockerfile for your image from Ubuntu with:
$ make > Dockerfile
Or you can create a Dockerfile based on Alpine Linux:
$ make ALPINE=1 > Dockerfile
Share this post: