Container.start.ps1

<#
.SYNOPSIS
    Starts the container.
.DESCRIPTION
    Starts a container.

    This script should be called from the Dockerfile as the ENTRYPOINT (or from within the ENTRYPOINT).

    It should be deployed to the root of the container image.

    ~~~Dockerfile
    # Thank you Microsoft! Thank you PowerShell! Thank you Docker!
    FROM mcr.microsoft.com/powershell
    # Set the shell to PowerShell (thanks again, Docker!)
    SHELL ["/bin/pwsh", "-nologo", "-command"]
    # Run the initialization script. This will do all remaining initialization in a single layer.
    RUN --mount=type=bind,src=./,target=/Initialize ./Initialize/Container.init.ps1

    ENTRYPOINT ["pwsh", "-nologo", "-file", "/Container.start.ps1"]
    ~~~
.NOTES
    Did you know that in PowerShell you can 'use' namespaces that do not really exist?
    This seems like a nice way to describe a relationship to a container image.
    That is why this file is using the namespace 'mcr.microsoft.com/powershell'.
    (this does nothing, but most likely will be used in the future)
#>

using namespace 'ghcr.io/powershellweb/psjekyll'

param()

$env:IN_CONTAINER = $true
$PSStyle.OutputRendering = 'Ansi'

$mountedFolders = @(if (Test-Path '/proc/mounts') {
    (Select-String "\S+\s(?<p>\S+).+rw?,.+symlinkroot=/mnt/host" "/proc/mounts").Matches.Groups |
        Where-Object Name -eq p |
        Get-Item -path { $_.Value }
})
   
if ($mountedFolders) {
    "Mounted $($mountedFolders.Length) folders:" | Out-Host
    $mountedFolders | Out-Host
}

if ($args) {
    # If there are arguments, output them (you could handle them in a more complex way).
    "$args" | Out-Host
    $global:ContainerStartArguments = @() + $args

    #region Custom
    foreach ($arg in $args) {
        $argAsUri = $arg -as [uri]
        if ($argAsUri -and $argAsUri.LocalPath -match '\.git' -or $argAsUri.DnsSafeHost -eq 'github.com') {
            $branchName = ''
            $repoUrl = 
                if ($argAsUri.DnsSafeHost -eq 'github.com') {
                    # If there were only two segments, then it is a repo.
                    if ($argAsUri.Segments -eq 3) {
                        "$arg"
                    } elseif ($argAsUri.Segments -match 'tree/$' -and $argAsUri.Segments.Length -ge 4) {
                        $branchName = $argAsUri.Segments[4..$($argAsUri.Segments.Length - 1)] -join ''
                        "https://github.com$($argAsUri.Segments[0..2] -join '')"
                    }
                } else {
                    $arg
                }
            $clonedRepo = 
                if ($branchName) {
                    git clone --branch $branchName $repoUrl
                } else {
                    git clone $repoUrl
                }
            
            $clonedRepo | Push-Location
            $foundConfigYaml = Get-ChildItem -Path $pwd -filter "_config.yml" -Recurse | 
                Select-Object -First 1 
            if ($foundConfigYaml) {
                $foundConfigYaml | 
                    Split-Path | 
                    Push-Location   
            }
            $jekyllJob = Start-PSJekyll
            while ($jekyllJob.State -notin 'Completed','Failed') {                
                Start-Sleep -Milliseconds (Get-Random -Min 1000 -Max 10000)
                $jekyllJob | Receive-Job | Out-Host
            }            
        }
    }
    #endregion Custom
} else {
    # If there are no arguments, see if there is a Microservice.ps1
    if (Test-Path './Microservice.ps1') {
        # If there is a Microservice.ps1, run it.
        . ./Microservice.ps1
    }
    #region Custom
    else 
    {
        # If a single drive is mounted, start the Jekyll server.
        if ($mountedFolders.Length -eq 1) {
            Push-Location $mountedFolders[0].Fullname            
            Start-PSJekyll
        } elseif ($psJekyll.CurrentSite) {           
            Push-Location $psJekyll.CurrentSite.Directory.FullName
            Start-PSJekyll
        }
    }
    #endregion Custom
}

# If you want to do something when the container is stopped, you can register an event.
# This can call a script that does some cleanup, or sends a message as the service is exiting.
Register-EngineEvent -SourceIdentifier PowerShell.Exiting -Action {
    if (Test-Path '/Container.stop.ps1') {
        & /Container.stop.ps1 
    }    
} | Out-Null