build.psm1
function New-LinuxVHDXDockerfile() { param( [string] $Dockerfile = "Dockerfile" ) Copy-Item $PSScriptRoot\Dockerfile.example $Dockerfile } function New-LinuxVHDX() { param( [Parameter()][AllowEmptyString()][string] $ComputerName, [Parameter()][AllowEmptyString()][string] $DockerContext, [Parameter()][AllowEmptyString()][string] $Dockerfile, [Parameter()][AllowEmptyString()][string] $RootAuthorizedKeys, [Parameter()][string] $OutputPath = ".", [Parameter()][string] $Name = "linux" ) $origloc = Get-Location $dockerctx = $DockerContext if ($dockerctx -eq "") { $dockerctx = $origloc } $dockerfile = $Dockerfile if ($dockerfile -eq "") { $dockerfile = "${dockerctx}\Dockerfile" } if (-not (test-path -pathtype leaf $dockerfile)) { Write-Error "$dockerfile does not exist. cannot convert it into a VM!" return } $tmp = "" while ($true) { try { $tmp = New-Item -Path $OutputPath\.temp-$(Get-Random) -itemtype directory break } catch {} } $buildId = (New-Guid).Guid try { &{ $cmimage="container-mine-base:$buildId" $bdimage="container-mine-build:$buildId" $output="container-mine-$buildId.vhdx" docker build --build-arg "ROOT_AUTHORIZED_KEYS=${RootAuthorizedKeys}" -f $dockerfile --progress plain -t $cmimage $dockerctx docker build -f $PSScriptRoot\Dockerfile.builder --build-arg "BASE_IMAGE=$cmimage" --progress plain -t $bdimage $PSScriptRoot $wip = (docker create $bdimage) 2>&1 if (Test-Path ${OutputPath}\${Name}.VHDX) { Remove-Item -Force "${OutputPath}\${Name}.VHDX" } docker cp "${wip}:/mkimage.vhdx" ${OutputPath}/${Name}.VHDX docker rm "${wip}" docker rmi "$bdimage" docker rmi "$cmimage" } | foreach-object {"$_"} | write-host } finally { Remove-Item -Recurse $tmp Set-Location $origloc } } |