Skip to content

Commit

Permalink
feat: PSJekyll Container.start.ps1 ( Fixes #13 )
Browse files Browse the repository at this point in the history
  • Loading branch information
James Brundage committed Oct 1, 2024
1 parent 40c0c4f commit c114646
Showing 1 changed file with 77 additions and 0 deletions.
77 changes: 77 additions & 0 deletions Container.start.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
<#
.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'

$mountedDrives = @(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 } |
New-PSDrive -Name { "Mount", $_.Name -join '.' } -PSProvider FileSystem -Root { $_.Value } -Scope Global -ErrorAction Ignore
})

if ($global:ContainerInfo.MountedPaths) {
"Mounted $($mountedPaths.Length) drives:" | Out-Host
$mountedDrives | Out-Host
}

if ($args) {
# If there are arguments, output them (you could handle them in a more complex way).
"$args" | Out-Host
} 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
{
<#Start-ThreadJob -Name "${env:ModuleName}.Jekyll" -ScriptBlock {
jekyll serve --host "$(
if ($env:JEKYLL_HOST) { $env:JEKYLL_HOST }
else { '*' }
)" '--port' $(
if ($env:JEKYLL_PORT) { $env:JEKYLL_PORT }
else { 4000 }
)
}#>
}
#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

0 comments on commit c114646

Please sign in to comment.