I have been playing a bit with Image2Docker with the intention to see how far I could go into containerizing existing workloads. To date, this PowerShell-based module by fellow MVP and Docker Captain Trevor Sullivan mounts a vhdx or wim Windows Image and tries to discover running artifacts, such as IIS, SQL or Apache, and generates a Dockerfile for a container hosting these services.
Now this is still experimental, and the list of accepted artifacts is still short, but I couldn't retain myself from trying to build a Docker container for the job.
Here's how I tackled this, knowing that as most of us, I am moving my first steps into this new feature of Windows 2016.
First of all I built the following Dockerfile in Visual Studio Code:
Basically I am issuing five statements:
- pull the microsoft/nanoserver image. Actually I could have used the microsoft/windowsservercore image as well but that would have taken longer
- state that I am the mantainer of the repository
- install the package manager called Nuget
- install the actual Image2Docker module (version 1.5 at the time of writing)
- set the ConvertTo-Dockerfile cmdlet as entry point for this container, so that I can pass the .vhdx or .wim image path straight into this dedicated container on execution
Then the next steps to publish to the Docker Hub are:
docker build . -t happysysadm/image2docker:latest -t happysysadm/image2docker:v0.1
In the step above I am issuing the build command from the folder containing the Dockerfile file, and I am setting two tags for the same image: latest and v0.1.
Then I logged in to the Hub:
docker login -u user -p password
And pushed the container into my public registry:
docker push happysysadm/image2docker
At this moment this repo becomes visible on the web:
Once I got your container up in the Hub, I cleaned up my local image:
docker rmi -f happysysadm/image2docker:v0.1
and pulled it again:
docker pull happysysadm/image2docker
Every time I have gone through an update of my Dockerfile, I had to do a rebuild and increment the version tag:
docker build . -t happysysadm/image2docker:latest -t happysysadm/image2docker:v0.2
In the step above the latest tag is passed to v0.2 and the previous image retains only the tag v0.1.
Now this container is public and you can just do:
docker run happysysadm/image2docker sample.vhdx
and get the Dockerfile for your Windows image created for you. Let me know how it goes and remember that this project is open source so everybody's contribution is accepted.