#json-format #yaml #dockerfile #json #generator #docker-build

build dofigen

A Dockerfile generator using a simplified description in YAML or JSON format create

9 releases (stable)

1.4.0 May 13, 2024
1.3.0 Apr 28, 2024
1.2.0 Jan 1, 2023
1.2.0-beta.1 Oct 9, 2022
0.0.0 Sep 14, 2022

#53 in Build Utils

Download history 5/week @ 2024-02-19 23/week @ 2024-02-26 3/week @ 2024-03-04 13/week @ 2024-03-11 20/week @ 2024-03-18 36/week @ 2024-04-01 218/week @ 2024-04-22 75/week @ 2024-04-29 240/week @ 2024-05-13

533 downloads per month
Used in lenra_cli

MIT license

49KB
607 lines

Contributors Forks Stargazers Issues MIT License Crates.io

Dofigen

Dofigen is a Dockerfile generator using a simplified description in YAML or JSON format. It defines default values and behaviors that simplify the creation of Dockerfiles.

Dofigen is also made to use the Buildkit optimizations that speed-up the Docker image build by parallelizing the layer builds. It uses the --link option when adding files and the --mount=type=cache option when running scripts (when you define caches attribute). You can use Buildkit with the docker buildx buid subcommand like this:

docker buildx build --cache-to=type=local,dest=.dockercache --cache-from=type=local,src=.dockercache -t my-app:latest --load .

A french DevOps said about it:

C'est une bouffée Dofigen dans ce monde de con...teneurs.

Report Bug · Request Feature

Getting Started

Prerequisites

Install Dofigen using one of the following options.

Cargo install

First install Cargo, the Rust package manager: https://doc.rust-lang.org/cargo/getting-started/installation.html

Then use the following command to install dofigen:

cargo install dofigen -F cli

Download the binary

You can download the Dofigen binary from the release page and add it to your path environment variable.

Use it with Docker

You can run Dofigen directly from its Docker image with the following command:

docker run --rm -it -v $(pwd):/app lenra/dofigen

(back to top)

How to use it

Use the help options to understand how to use it:

$ dofigen --help
dofigen 0.0.0
Dofigen is a Dockerfile generator using a simplified description in YAML or JSON format

USAGE:
    dofigen [OPTIONS] [INPUT_FILE]

ARGS:
    <INPUT_FILE>    The input Dofigen file. Default reads stdin

OPTIONS:
    -d, --dockerfile <DOCKERFILE>    The output Dockerfile file [default: Dockerfile]
    -f, --format <FORMAT>            The input format [default: yaml] [possible values: json, yaml]
    -h, --help                       Print help information
    -i, --ignorefile <IGNOREFILE>    The output .dockerignore file [default: .dockerignore]
    -o, --output                     Writes the Dockerfile to the stdout
    -V, --version                    Print version information

Image descriptor

The structure of the image descriptor was created to be simpler than the Dockerfile.

Here is an example to generate the Dofigen Dockerfile:

---
builders:
- name: builder
  image: ekidd/rust-musl-builder
  adds:
  - "."
  script:
  # Build with musl to work with scratch
  - cargo build --release --target=x86_64-unknown-linux-musl
  # copy the generated binary outside of the target directory. If not the other stages won't be able to find it since it's in a cache volume
  - mv target/x86_64-unknown-linux-musl/release/dofigen ../
  caches:
  # Cargo cache
  - /home/rust/.cargo
  # build cache
  - /home/rust/src/target
image: scratch
workdir: /app
artifacts:
- builder: builder
  source: "/home/rust/dofigen"
  destination: "/bin/"
entrypoint: 
- /bin/dofigen
cmd:
- --help
context:
- "/dofigen"
- "/dofigen_lib"
- "/Cargo.*"

Image

The image is the main element. It defines the runtime stage of the Dockerfile:

Field Alias Type Description
image from String? The FROM Docker image
user String? The runtime user (default 1000)
workdir String? The runtime work directory
envs env Map<String, String>? The runtime environment variables
artifacts Artifact[]? Defines artifacts to copy from builders
adds add String[]? Paths of elements to add at build time to the workdir
root Root? Actions made using the root user
script run String[]? Script commands to execute
caches cache String[]? Paths in the image stage to cache during the script execution. Be careful when using caches because the cached directory is not present after the script execution
builders Builder[]? Build stages executed before the runtime stage and not in the final Docker image. Mostly to generate artifacts
ports int[]? The list of exposed ports of the Docker image
healthcheck Healthcheck? The Docker image healthcheck definition.
entrypoint String[]? The Docker image ENTRYPOINT parts
cmd String[]? The Docker image CMD parts
context String[]? Paths of the elements to include in the Docker build context. They are used to generate the .dockerignore file
ignores ignore String[]? Paths to generate the .dockerignore file

Builder

The builders are stages executed before the runtime stage and not in the final Docker image. Mostly to generate artifacts :

Field Alias Type Description
name String? The builder name. If not defined, a name is defined with the given pattern: builder-<position in the builders list starting at 0>
image from String? The FROM Docker image of the builder
user String? The builder user
workdir String? The builder work directory
envs env Map<String, String>? The builder environment variables
artifacts Artifact[]? Defines artifacts to copy from previous builders
adds add String[]? Paths of elements to add at build time to the workdir
root Root? Actions made using the root user
script run String[]? Script commands to execute
caches cache String[]? Paths in the image stage to cache during the script execution. Be careful when using caches because the cached directory is not present after the script execution

Artifact

Artifacts are element copied from a previous build to the current stage :

Field Alias Type Description
builder String The builder name from which the artifact will be copied
source String The source of the artifact in the given builder
destination target String The destination path in the current stage

Root

Actions made using the root user :

Field Alias Type Description
script run String[]? Script commands to execute
caches cache String[]? Paths in the image stage to cache during the script execution. Be careful when using caches because the cached directory is not present after the script execution

Healthcheck

The Docker image's healthcheck definition. It defines when the container is not healthy :

Field Alias Type Description
cmd String The command executed to check the container health
interval String? The command execution interval (default 30s)
timeout String? The command execution timeout (default 30s)
start String? The duration before starting the command execution at container start (default 0s)
retries int? The number of retries before defining the container as unhealthy (default 3)

(back to top)

Contributing

Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.

If you have a suggestion that would make this better, please open an issue with the tag "enhancement" or "bug". Don't forget to give the project a star! Thanks again!

(back to top)

License

Distributed under the MIT License. See LICENSE for more information.

(back to top)

Contact

Lenra - @lenra_dev - contact@lenra.io

Project Link: https://github.com/lenra-io/dofigen

(back to top)

Dependencies

~2.1–3MB
~68K SLoC