How to build ASP.NET Framework Docker images on VSTS build tasks
As you know, Visual Studio Team Services offers to build Docker image tasks and Visual Studio offers Docker support. But there are some tips when you build ASP.NET Framework Docker images with VSTS build tasks. This post shows how to setup that.
You must note your OS versions of Docker images, because you must need to setup Private Agent if your base OS version is Windows Server version 1709. Refer below article at first if you need.
normalian.hatenablog.com
What's happened if you build ASP.NET Framework Docker images with default settings
You can choose "Add - Docker Support" like below if you have setup "Visual Studio Tools for Docker" in your machine. The tool is really useful and it will generate below Dockerfile in your ASP.NET Framework application.
FROM microsoft/aspnet:4.7.1-windowsservercore-1709 ARG source WORKDIR /inetpub/wwwroot COPY ${source:-obj/Docker/publish} .
Last "COPY" command line is a little bit tricky, because copy sources directory will change with ${source} variable value. The directory will be ${source} variable value if the value is set, but the directory will be obj/Docker/publish if ${source} variable isn't set.
This Dockerfile should work on your machine, but it won't work on VSTS build tasks like below.
2018-03-20T16:23:53.7207717Z ##[section]Starting: Build an image 2018-03-20T16:23:53.7213905Z ============================================================================== 2018-03-20T16:23:53.7214387Z Task : Docker 2018-03-20T16:23:53.7214924Z Description : Build, tag, push, or run Docker images, or run a Docker command. Task can be used with Docker or Azure Container registry. 2018-03-20T16:23:53.7215463Z Version : 0.3.10 2018-03-20T16:23:53.7215860Z Author : Microsoft Corporation 2018-03-20T16:23:53.7216376Z Help : [More Information](https://go.microsoft.com/fwlink/?linkid=848006) 2018-03-20T16:23:53.7216914Z ============================================================================== 2018-03-20T16:23:54.9185089Z [command]"C:\Program Files\Docker\docker.exe" build -f C:\agent\_work\1\s\Trunk\SFwithASPNetApp\ASPNetApp01\Dockerfile -t xxxxxxxxxxxxxxxxxxxister.azurecr.io/yyyyyyyyyyy-demo-projects:80 C:\agent\_work\1\s\Trunk\SFwithASPNetApp\ASPNetApp01 2018-03-20T16:23:55.0276465Z Sending build context to Docker daemon 3.072kB 2018-03-20T16:23:55.0278113Z 2018-03-20T16:23:55.0302771Z Step 1/4 : FROM microsoft/aspnet:4.7.1-windowsservercore-1709 2018-03-20T16:23:55.0313682Z ---> dc3f4d701ead 2018-03-20T16:23:55.0315249Z Step 2/4 : ARG source 2018-03-20T16:23:55.0326718Z ---> Using cache 2018-03-20T16:23:55.0328908Z ---> 9a10d9b50bc9 2018-03-20T16:23:55.0329320Z Step 3/4 : WORKDIR /inetpub/wwwroot 2018-03-20T16:23:55.0340016Z ---> Using cache 2018-03-20T16:23:55.0342052Z ---> 28d5a9cc0dd0 2018-03-20T16:23:55.0342974Z Step 4/4 : COPY ${source:-obj/Docker/publish} . 2018-03-20T16:23:55.0348449Z COPY failed: GetFileAttributesEx \\?\C:\Windows\TEMP\docker-builder521937930\obj\Docker\publish: The system cannot find the path specified. 2018-03-20T16:23:55.0575409Z ##[error]C:\Program Files\Docker\docker.exe failed with return code: 1 2018-03-20T16:23:55.0588673Z ##[section]Finishing: Build an image
What is workaround of the issue?
You need to setup both Visual Studio and VSTS in this case. Please follow below steps .
Setup in your ASP.NET Framework project
At first you need to setup new pubxml file in your ASP.NET Framework project to ensure output binaries into "obj\Docker\publish" directory, so choose "Publish" from right click menu of your ASP.NET Framework project like below.
Choose "Folder" as target and edit "Choose a folder" as "obj\Docker\publish" like below.
After setup the pubxml file, you can find it in your ASP.NET Framework like below. In this case, the filename is "FolderProfile.pubxml".
Setup in your VSTS tasks
You need to update "Build Solution" tasks at first. Please note to add "/p:PublishProfile=FolderProfile.pubxml" and remove "/p:WebPublishMethod=Package".
- "MSBuild Arguments" - before change
/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactstagingdirectory)\\"
- "MSBuild Arguments" - after change
/p:DeployOnBuild=true /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactstagingdirectory)\\" /p:PublishProfile=FolderProfile.pubxml
After setup "Build Solution" tasks correctly, you can just add "Build an Image" task and specify "Docker file" correctly like below.
And you also need to add "Push an image" to store your Docker images into some registries. Note to specify as "Push an Image" not "Push images" like below.
You can find your Docker images in your Container registry if the build process on VSTS work correctly.