Back in November, shortly after Microsoft’s open-sourcing of PowerShell, and subsequent cross-platform PowerShell Core release, VMware released their cross-platform version of PowerCLI: PowerCLI Core. This was made available on GitHub for general consumption, and can be installed on top of PowerShell Core on a macOS/OSX or Linux machine.
I have loads of junk installed on my MacBook, including the very first public release of PowerShell Core, but keeping it all up to date, and knowing what I have installed can be a pain, so my preference for running PowerShell Core, or PowerCLI Core at the moment is through a Docker container on my laptop, this helps keep the clutter down and makes upgrading easy.
In this post I’m going to show how to use the Docker container with an external editor, and be able to run all your scripts from within the container, removing the need to install PowerShell Core on your Mac.
Pre-requisites
We will need to install a couple of bits of software before we begin:
- Docker Community Edition for macOS
- A code editor – I use Atom at the moment
Beyond that we will get everything below.
Getting the Docker image
VMware have made the PowerCLI Core Docker image available on Docker Hub (here), this is the easiest place to pull container images from to your desktop, and is the general go-to place for public container images as of today. This can be downloaded once the Docker CE is installed through the command below:
Icarus:~ root$ docker pull vmware/powerclicore:latest latest: Pulling from vmware/powerclicore 93b3dcee11d6: Already exists d6641ceee635: Pull complete 62bbcce52faa: Pull complete e86aa7a78685: Pull complete db20fbdf24c0: Pull complete 37379feb8f29: Pull complete 8abb449d1e29: Pull complete a9cd6d9452e7: Pull complete 50886ff01a73: Pull complete 74af7eaa49c1: Pull complete 878c611eaf2c: Pull complete 39b1b7978191: Pull complete 98e632013bea: Pull complete 4362432cb5ea: Pull complete 19f5f892ae79: Pull complete 29b0b093b159: Pull complete 913ad6409b89: Pull complete ad5db0a55033: Pull complete Digest: sha256:d33ac26c0c704a7aa48f5c7c66cb76ec3959beda2962ccd6a41a96351055b5d0 Status: Downloaded newer image for vmware/powerclicore:latest Icarus:~ root$
This may take a couple of minutes, but the image should now be present on the local machine, and ready to fire up.
Getting the path for our scripts folder
Before we launch our container we need our scripts path, this could be a folder anywhere on your computer, in my case it is:
/Users/tim/Dropbox/Coding Projects/PowerShell/VMware
Launching our container
The idea here is to launch a folder which is accessible from both inside and outside our container, so we can edit the scripts with our full fat editor, and run them from inside the container.
To launch the container, we use the following command, I explain the switches used below:
docker run --name PowerCLI --detach -it --rm --volume '/Users/tim/Dropbox/Coding Projects/PowerShell/VMware':/usr/scripts vmware/powerclicore:latest
- –name – this sets the container name, which will make it easier when we want to attach to the container
- –detach – this starts the container without attaching us to it immediately, meaning if there is anything else we need to do before connecting we can
- -it – this creates an interactive TTY connection, giving us the ability to interact with the console of the container
- –rm – this will delete the container when we exit it, this should keep the processes tidy on our machine
- –volume … – this maps our scripts folder to /usr/scripts, so we can consume our scripts once in the container
- vmware/powercli:latest – the name of the image to launch the container from
Now when we run this we will see the following output:
Icarus:~ root$ docker run --name PowerCLI --detach -it --rm --volume '/Users/tim/Dropbox/Coding Projects/PowerShell/VMware':/usr/scripts vmware/powerclicore:latest c48ff51e3f824177da8e3b0fd0210e5864b01fea94ae5f5871b3654b4f5bcd35 Icarus:~ root$
This is the UID for our container, we won’t need this, as we will attach using the friendly name for our container anyway. When you are ready to attach, use the following command:
Icarus:~ root$ docker attach PowerCLI
You may need to press return a couple of times, but you should now have a shell that looks like this:
PS /powershell>
Now we are in the container, and should be able to access our scripts by changing directory to /usr/scripts.
If we run ‘Get-Module -ListAvailable’ we can see the modules installed in this Docker image:
PS /powershell> Get-Module -ListAvailable Directory: /root/.local/share/powershell/Modules ModuleType Version Name ExportedCommands ---------- ------- ---- ---------------- Binary 1.21 PowerCLI.Vds Binary 1.21 PowerCLI.ViCore HookGetViewAutoCompleter Script 2.1.0 PowerNSX {Add-XmlElement, Format-Xml, Invoke-NsxRestMethod, Invoke-... Script 2.0.0 PowervRA {Add-vRAPrincipalToTenantRole, Add-vRAReservationNetwork, ... Directory: /opt/microsoft/powershell/6.0.0-alpha.14/Modules ModuleType Version Name ExportedCommands ---------- ------- ---- ---------------- Manifest 1.0.1.0 Microsoft.PowerShell.Archive {Compress-Archive, Expand-Archive} Manifest 3.0.0.0 Microsoft.PowerShell.Host {Start-Transcript, Stop-Transcript} Manifest 3.1.0.0 Microsoft.PowerShell.Management {Add-Content, Clear-Content, Clear-ItemProperty, Join-Path... Manifest 3.0.0.0 Microsoft.PowerShell.Security {Get-Credential, Get-ExecutionPolicy, Set-ExecutionPolicy,... Manifest 3.1.0.0 Microsoft.PowerShell.Utility {Format-List, Format-Custom, Format-Table, Format-Wide...} Script 1.1.2.0 PackageManagement {Find-Package, Get-Package, Get-PackageProvider, Get-Packa... Script 3.3.9 Pester {Describe, Context, It, Should...} Script 1.1.2.0 PowerShellGet {Install-Module, Find-Module, Save-Module, Update-Module...} Script 0.0 PSDesiredStateConfiguration {IsHiddenResource, StrongConnect, Write-MetaConfigFile, Ge... Script 1.2 PSReadLine {Get-PSReadlineKeyHandler, Set-PSReadlineKeyHandler, Remov... PS /powershell>
So we have the PowerCLI Core module, the Distributed vSwitch module, as well as PowervRA and PowerNSX. We should be able to run our scripts from the /usr/share folder, or just run stuff from scratch.
The great thing is we can now edit our scripts in the folder mapped to /usr/share using our editor, and the changes are available live to test our scripts, and we can even write output to this folder from within the container.
If you want to detach from the container without killing it then use the Ctrl+P+Q key combination, you can then reattach with ‘docker attach PowerCLI’. When you are done with the container type ‘exit’ and it will quit and be removed.
Conclusion
Though basic, this can really help with workflow when writing and testing scripts on macOS, while enabling you to simply keep up to date with the latest images, and not fill your Mac with more junk.