Buffet 🍜
Assemble many Dockerfiles in a single Dockerfile. This gives you the convenience of one Docker image with your favorite tools while keeping a separate Dockerfile per tool.
Demo example
A Dockerfile for Prettier
FROM alpine:3.12.0
RUN apk add --no-cache yarn~=1.22 \
&& yarn global add prettier@2.1.2
WORKDIR /workdir
plus a Dockerfile for HTML Tidy
FROM alpine:3.12.0
RUN apk add --no-cache tidyhtml~=5.6
WORKDIR /workdir
are automatically assembled in a single Dockerfile
FROM alpine:3.12.0
RUN apk add --no-cache yarn~=1.22 \
&& yarn global add prettier@2.1.2 \
&& apk add --no-cache tidyhtml~=5.6
WORKDIR /workdir
You can try this yourself by running
buffet assemble examples/minimal_demonstration
See Code Cleaner Buffet for an application of this.
Installation
For a quick start, use the Docker image evolutics/buffet
. I recommend a Bash alias like
alias buffet='docker run --rm --volume "$(pwd)":/workdir evolutics/buffet'
You are ready when
buffet --help
works.
Alternatively, you can do a native installation with stack install buffet
or cabal install buffet
.
Usage example
Say we work on a simple website with HTML code that we would like to format, clean up, and validate. For this purpose, we choose the tools Prettier and HTML Tidy, which we plan use in continuous integration via a Docker image.
For the following, we assume you first run
git clone https://github.com/evolutics/buffet.git
cd buffet
The source code for this and other examples is in the examples
folder.
Assembling
In the subfolders of examples/quick_start
, you see a Dockerfile for Prettier and another Dockerfile for HTML Tidy. These Dockerfiles (called "dishes") are the modular toy blocks, which we now automatically combine to one Dockerfile (called "buffet") by running
buffet assemble examples/quick_start
This prints a Dockerfile based on the subfolders of examples/quick_start
to stdout. From this, we can then build a Docker image mona_linta
with
buffet assemble examples/quick_start | docker build --tag mona_linta -
Note the hyphen -
at the end that makes Docker read the Dockerfile from stdin.
Testing
As a demo that our Docker image works as expected, run
docker run -it --rm mona_linta
prettier --version
tidy --version
To integrate a check like prettier --version
as a test of the tool installation, add a HEALTHCHECK
instruction as you see in the Dockerfile for Prettier. The exit status of such a command is then reported when you run our example test suite with
buffet test --arguments examples/quick_start/test_arguments.yaml \
examples/quick_start
This builds a Docker image to then run the tests. Only the dishes referred in the file test_arguments.yaml
are tested.
Note: As buffet test …
executes Docker commands, a native installation is required here.
If you like, try adding a test for HTML Tidy.
Documenting
You can generate documentation with
buffet document --template examples/quick_start/document_template.md.mustache \
examples/quick_start
This renders the template document_template.md.mustache
. To print the raw template context, omit this option as in
buffet document examples/quick_start
Among others, data from LABEL
instructions is integrated in the template context.
API usage
You may like to programmatically process the parsed source Dockerfiles. To print an intermediate representation in JSON, run
buffet parse examples/quick_start
Terminology
- Buffet: A Dockerfile automatically assembled based on many dishes.
- Dish: A Dockerfile, usually providing a specific command-line tool.
- Menu: Configuration with a list of dishes to be assembled in a buffet.