The goal of this project is to generate docker-compose literate YAML in C# using the builder design pattern
This project was inspired by The need to create dynamically generated docker-compose files the right way, without using templates and replacement techniques; as well as providing a wide range of developer friendly methods and enums for quick access without the need to constantly check documentation.
var dbUser = "root";
var dbPass = "pass";
var dbName = "wordpress";
var network1 = Builder.MakeNetwork("my-net")
    .SetExternal(true)
    .Build();
var network2 = Builder.MakeNetwork("my-net2")
    .Build();
var mysql = Builder.MakeService("db")
    .WithImage("mysql:5.7")
    .WithNetworks(network1)
    .WithExposed("3306")
    .WithEnvironment(mb => mb
        .WithProperty("MYSQL_ROOT_PASSWORD", dbPass)
        .WithProperty("MYSQL_DATABASE", dbName)
        .WithProperty("MYSQL_USER", dbUser)
        .WithProperty("MYSQL_PASSWORD", dbPass)
    )
    .WithRestartPolicy(ERestartMode.Always)
    .WithSwarm()
    .WithDeploy(d => d
        .WithMode(EReplicationMode.Replicated)
        .WithReplicas(3))
    .Build();
var wordpress = Builder.MakeService("wordpress")
    .WithImage("wordpress:latest")
    .WithNetworks(network1, network2)
    .WithPortMapping("8000:80")
    .WithEnvironment(mb => mb
        .WithProperty("WORDPRESS_DB_HOST", $"{mysql.Name}:3306")
        .WithProperty("WORDPRESS_DB_USER", dbUser)
        .WithProperty("WORDPRESS_DB_PASSWORD", dbPass)
        .WithProperty("WORDPRESS_DB_NAME", dbName)
    )
    .WithDependencies(mysql)
    .WithRestartPolicy(ERestartMode.UnlessStopped)
    .WithSwarm()
    .WithDeploy(d => d
        .WithMode(EReplicationMode.Global)
    )
    .Build();
var compose = Builder.MakeCompose()
    .WithServices(mysql, wordpress)
    .WithNetworks(network1, network2)
    .Build();
// serialize our object graph to yaml for writing to a docker-compose file
var result = compose.Serialize();