{"id":919,"date":"2021-09-15T16:30:14","date_gmt":"2021-09-15T03:30:14","guid":{"rendered":"https:\/\/blog.wiseowls.co.nz\/?p=919"},"modified":"2021-09-15T16:36:24","modified_gmt":"2021-09-15T03:36:24","slug":"tagging-containers-in-azure-devops","status":"publish","type":"post","link":"https:\/\/blog.wiseowls.co.nz\/index.php\/2021\/09\/15\/tagging-containers-in-azure-devops\/","title":{"rendered":"Things they don&#8217;t tell you &#8211; Tagging containers in Azure DevOps"},"content":{"rendered":"\n<p>Here&#8217;s an interesting gotcha that has kept us occupied for a little while. Our client wanted us to build an Azure DevOps pipeline that would build a container, tag it, and launch the image to do more work. As the result was not really worth pushing up to image registries, we decided to go fully local.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Setting up agent pool<\/h2>\n\n\n\n<p>Our client had further constraint that prevented them from using managed agents so first thing we had to do was to define a <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/agents\/pools-queues?view=azure-devops&amp;tabs=yaml%2Cbrowser\">local pool<\/a>. The process was uneventful, so we thought we&#8217;re off to a good start. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Creating Azure DevOps pipeline<\/h2>\n\n\n\n<p>Our first stab yielded a pipeline definition along the following lines:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">trigger:\n  - none\n\njobs:\n  - job: test\n    pool:\n      name: local-linux-pool\n    displayName: Build Cool software\n    steps:\n      - task: Bash@3\n        displayName: Prune leftover containers\n        inputs:\n          targetType: inline\n          script: |\n            docker system prune -f -a\n\n      - task: Docker@2\n        displayName: Build worker container\n        inputs:          \n          command: build\n          Dockerfile: 'container\/Dockerfile'\n          tags: |\n            supercool\/test-app # tagging container would simplify our next step and avoid us headaches of trying to figure out correct ID\n\n      - bash: |\n          docker run --name builderContainer -it --rm supercool\/test-app:latest # we assume latest is the correct tag here<\/code><\/pre>\n\n\n\n<p>Nothing fancy here. We clean the environment before each run (this would be optional but helped troubleshooting). Then we build a container from a Dockerfile we found in source control. To make sure we run the right thing on next step we want to tag it. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">But then it went sideways&#8230;<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">Unable to find image 'supercool\/test-app:latest' locally\ndocker: Error response from daemon: pull access denied for test-app, repository does not exist or may require 'docker login': denied: requested access to the resource is denied.<\/code><\/pre>\n\n\n\n<p>This of course means docker could not detect a local image and went off to pull it from the default registry. And we don&#8217;t want that!<\/p>\n\n\n\n<p>Upon further inspection we found command line that builds container DOES NOT tag it!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">\/usr\/bin\/docker build \\\n\t\t-f \/myagent\/_work\/1\/s\/container\/Dockerfile \\\n\t\t--label com.azure.dev.image.system.teamfoundationcollectionuri=https:\/\/dev.azure.com\/thisorgdoesnotexist\/ \\\n\t\t--label com.azure.dev.image.system.teamproject=test \\\n\t\t--label com.azure.dev.image.build.repository.name=test \\\n\t\t--label com.azure.dev.image.build.sourceversion=3d7a6ed84b0e9538b1b29206fd1651b44c0f74d8 \\\n\t\t--label com.azure.dev.image.build.repository.uri=https:\/\/thisorgdoesnotexist@dev.azure.com\/thisorgdoesnotexist\/test\/_git\/test \\\n\t\t--label com.azure.dev.image.build.sourcebranchname=main \\\n\t\t--label com.azure.dev.image.build.definitionname=test \\\n\t\t--label com.azure.dev.image.build.buildnumber=20262388.5 \\\n\t\t--label com.azure.dev.image.build.builduri=vstfs:\/\/\/Build\/Build\/11 \\\n\t\t--label image.base.ref.name=alpine:3.12 \\\n\t\t--label image.base.digest=sha256:a296b4c6f6ee2b88f095b61e95c7dde451ba25598835b4978c9256d8c8ace48a \\\n\t\t\/myagent\/_work\/1\/s\/container\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">How does this happen?<\/h2>\n\n\n\n<p>Luckily,  <a href=\"https:\/\/github.com\/microsoft\/azure-pipelines-tasks\/tree\/master\/Tasks\/DockerV2\">DockerV2<\/a> is Open Source and freely available on GitHub. Looking at the code, we notice an interesting <a href=\"https:\/\/github.com\/microsoft\/azure-pipelines-tasks\/blob\/master\/Tasks\/DockerV2\/task.json#L177\">error message<\/a>: <code>\"NotAddingAnyTagsToBuild\": \"Not adding any tags to the built image as no repository is specified.\"<\/code> Is that our clue? Seems like it may be. Let&#8217;s keep digging. <\/p>\n\n\n\n<p>Further inspection <a href=\"https:\/\/github.com\/microsoft\/azure-pipelines-tasks\/blob\/master\/Tasks\/DockerV2\/dockerbuild.ts#L65\">reveals<\/a> for tags to get applied, task must be able to infer image name:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"typescript\" class=\"language-typescript\"> if (imageNames &amp;&amp; imageNames.length &gt; 0) {\n        ....\n        tagArguments.push(imageName);\n        ....\n    }\n    else {\n        tl.debug(tl.loc('NotAddingAnyTagsToBuild'));\n    }<\/code><\/pre>\n\n\n\n<p>And that information must come from a <code>repository<\/code> input parameter. <\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Repository &#8211; (Optional) Name of repository within the container registry corresponding to the Docker registry service connection specified as input for&nbsp;<code>containerRegistry<\/code><\/p><cite>Looking at the <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/tasks\/build\/docker?view=azure-devops\">documentation<\/a>, this makes no sense<\/cite><\/blockquote>\n\n\n\n<p>A further peek into the source code, however, reveals that developers have <a href=\"https:\/\/github.com\/microsoft\/azure-pipelines-tasks\/blob\/master\/common-npm-packages\/docker-common-v2\/containerconnection.ts#L102\">kindly thought about<\/a> local tagging:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"typescript\" class=\"language-typescript\">public getQualifiedImageNamesFromConfig(repository: string, enforceDockerNamingConvention?: boolean) {\n        let imageNames: string[] = [];\n        if (repository) {\n            let regUrls = this.getRegistryUrlsFromDockerConfig();\n            if (regUrls &amp;&amp; regUrls.length &gt; 0) {\n\n                \/\/ not our case, skipping for brevity\n            }\n            else {\n                \/\/ in case there is no login information found and a repository is specified, the intention\n                \/\/ might be to tag the image to refer locally.\n                let imageName = repository;\n                if (enforceDockerNamingConvention) {\n                    imageName = imageUtils.generateValidImageName(imageName);\n                }\n                \n                imageNames.push(imageName);\n            }\n        }\n\n        return imageNames;\n    }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Now we can solve it<\/h2>\n\n\n\n<p>Adding <code>repository<\/code> input to our task without specifying <code>containerRegistry<\/code> should get us the desired result:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">...\n      - task: Docker@2\n        displayName: Build worker container\n        inputs:          \n          command: build\n          Dockerfile: 'container\/Dockerfile'\n          repository: supercool\/test-app # moving this from tag input to repository does magic!\n...<\/code><\/pre>\n\n\n\n<p>Looking at the logs we seem to have won:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">\/usr\/bin\/docker build \\\n\t\t-f \/myagent\/_work\/1\/s\/container\/Dockerfile \\\n\t\t#... ADO labels go here, irrelevant\n\t\t-t supercool\/test-app \\\n\t\t\/myagent\/_work\/1\/s\/container<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>This scenario, however far-fetched it may appear, seems to be fully supported. At least on the code level. Documentation is lacking a little bit, but I understand how this nuance may be hard to convey in 1-2 paragraphs when there&#8217;s so much else to cover.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Here&#8217;s an interesting gotcha that has kept us occupied for a little while. Our client wanted us to build an Azure DevOps pipeline that would build a container, tag it, and launch the image to do more work. As the result was not really worth pushing up to image registries, we decided to go fully &hellip; <a href=\"https:\/\/blog.wiseowls.co.nz\/index.php\/2021\/09\/15\/tagging-containers-in-azure-devops\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Things they don&#8217;t tell you &#8211; Tagging containers in Azure DevOps&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":925,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[50],"tags":[48],"class_list":["post-919","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cloud","tag-azure"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Things they don&#039;t tell you - Tagging containers in Azure DevOps - Timur and associates<\/title>\n<meta name=\"description\" content=\"We have set out on a journey to build containers with Azure DevOps. This quickly turned into a source code tracing exercise.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.wiseowls.co.nz\/index.php\/2021\/09\/15\/tagging-containers-in-azure-devops\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Things they don&#039;t tell you - Tagging containers in Azure DevOps - Timur and associates\" \/>\n<meta property=\"og:description\" content=\"We have set out on a journey to build containers with Azure DevOps. This quickly turned into a source code tracing exercise.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.wiseowls.co.nz\/index.php\/2021\/09\/15\/tagging-containers-in-azure-devops\/\" \/>\n<meta property=\"og:site_name\" content=\"Timur and associates\" \/>\n<meta property=\"article:published_time\" content=\"2021-09-15T03:30:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-09-15T03:36:24+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2021\/09\/tom-radetzki-idRpmZVNs30-unsplash-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1247\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"timur\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@TimurKh\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2021\\\/09\\\/15\\\/tagging-containers-in-azure-devops\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2021\\\/09\\\/15\\\/tagging-containers-in-azure-devops\\\/\"},\"author\":{\"name\":\"timur\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#\\\/schema\\\/person\\\/34d0ed30d573b5bc317ea990bd2e0c59\"},\"headline\":\"Things they don&#8217;t tell you &#8211; Tagging containers in Azure DevOps\",\"datePublished\":\"2021-09-15T03:30:14+00:00\",\"dateModified\":\"2021-09-15T03:36:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2021\\\/09\\\/15\\\/tagging-containers-in-azure-devops\\\/\"},\"wordCount\":396,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2021\\\/09\\\/15\\\/tagging-containers-in-azure-devops\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/wp-content\\\/uploads\\\/2021\\\/09\\\/tom-radetzki-idRpmZVNs30-unsplash-scaled.jpg\",\"keywords\":[\"azure\"],\"articleSection\":[\"Cloud\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2021\\\/09\\\/15\\\/tagging-containers-in-azure-devops\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2021\\\/09\\\/15\\\/tagging-containers-in-azure-devops\\\/\",\"url\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2021\\\/09\\\/15\\\/tagging-containers-in-azure-devops\\\/\",\"name\":\"Things they don't tell you - Tagging containers in Azure DevOps - Timur and associates\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2021\\\/09\\\/15\\\/tagging-containers-in-azure-devops\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2021\\\/09\\\/15\\\/tagging-containers-in-azure-devops\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/wp-content\\\/uploads\\\/2021\\\/09\\\/tom-radetzki-idRpmZVNs30-unsplash-scaled.jpg\",\"datePublished\":\"2021-09-15T03:30:14+00:00\",\"dateModified\":\"2021-09-15T03:36:24+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#\\\/schema\\\/person\\\/34d0ed30d573b5bc317ea990bd2e0c59\"},\"description\":\"We have set out on a journey to build containers with Azure DevOps. This quickly turned into a source code tracing exercise.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2021\\\/09\\\/15\\\/tagging-containers-in-azure-devops\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2021\\\/09\\\/15\\\/tagging-containers-in-azure-devops\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2021\\\/09\\\/15\\\/tagging-containers-in-azure-devops\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/wp-content\\\/uploads\\\/2021\\\/09\\\/tom-radetzki-idRpmZVNs30-unsplash-scaled.jpg\",\"contentUrl\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/wp-content\\\/uploads\\\/2021\\\/09\\\/tom-radetzki-idRpmZVNs30-unsplash-scaled.jpg\",\"width\":2560,\"height\":1247,\"caption\":\"conspiracy\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2021\\\/09\\\/15\\\/tagging-containers-in-azure-devops\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Things they don&#8217;t tell you &#8211; Tagging containers in Azure DevOps\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#website\",\"url\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/\",\"name\":\"Timur and associates\",\"description\":\"Notes of an IT contractor\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#\\\/schema\\\/person\\\/34d0ed30d573b5bc317ea990bd2e0c59\",\"name\":\"timur\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg\",\"caption\":\"timur\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/TimurKh\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Things they don't tell you - Tagging containers in Azure DevOps - Timur and associates","description":"We have set out on a journey to build containers with Azure DevOps. This quickly turned into a source code tracing exercise.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.wiseowls.co.nz\/index.php\/2021\/09\/15\/tagging-containers-in-azure-devops\/","og_locale":"en_US","og_type":"article","og_title":"Things they don't tell you - Tagging containers in Azure DevOps - Timur and associates","og_description":"We have set out on a journey to build containers with Azure DevOps. This quickly turned into a source code tracing exercise.","og_url":"https:\/\/blog.wiseowls.co.nz\/index.php\/2021\/09\/15\/tagging-containers-in-azure-devops\/","og_site_name":"Timur and associates","article_published_time":"2021-09-15T03:30:14+00:00","article_modified_time":"2021-09-15T03:36:24+00:00","og_image":[{"width":2560,"height":1247,"url":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2021\/09\/tom-radetzki-idRpmZVNs30-unsplash-scaled.jpg","type":"image\/jpeg"}],"author":"timur","twitter_card":"summary_large_image","twitter_creator":"@TimurKh","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2021\/09\/15\/tagging-containers-in-azure-devops\/#article","isPartOf":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2021\/09\/15\/tagging-containers-in-azure-devops\/"},"author":{"name":"timur","@id":"https:\/\/blog.wiseowls.co.nz\/#\/schema\/person\/34d0ed30d573b5bc317ea990bd2e0c59"},"headline":"Things they don&#8217;t tell you &#8211; Tagging containers in Azure DevOps","datePublished":"2021-09-15T03:30:14+00:00","dateModified":"2021-09-15T03:36:24+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2021\/09\/15\/tagging-containers-in-azure-devops\/"},"wordCount":396,"commentCount":0,"image":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2021\/09\/15\/tagging-containers-in-azure-devops\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2021\/09\/tom-radetzki-idRpmZVNs30-unsplash-scaled.jpg","keywords":["azure"],"articleSection":["Cloud"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.wiseowls.co.nz\/index.php\/2021\/09\/15\/tagging-containers-in-azure-devops\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2021\/09\/15\/tagging-containers-in-azure-devops\/","url":"https:\/\/blog.wiseowls.co.nz\/index.php\/2021\/09\/15\/tagging-containers-in-azure-devops\/","name":"Things they don't tell you - Tagging containers in Azure DevOps - Timur and associates","isPartOf":{"@id":"https:\/\/blog.wiseowls.co.nz\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2021\/09\/15\/tagging-containers-in-azure-devops\/#primaryimage"},"image":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2021\/09\/15\/tagging-containers-in-azure-devops\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2021\/09\/tom-radetzki-idRpmZVNs30-unsplash-scaled.jpg","datePublished":"2021-09-15T03:30:14+00:00","dateModified":"2021-09-15T03:36:24+00:00","author":{"@id":"https:\/\/blog.wiseowls.co.nz\/#\/schema\/person\/34d0ed30d573b5bc317ea990bd2e0c59"},"description":"We have set out on a journey to build containers with Azure DevOps. This quickly turned into a source code tracing exercise.","breadcrumb":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2021\/09\/15\/tagging-containers-in-azure-devops\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.wiseowls.co.nz\/index.php\/2021\/09\/15\/tagging-containers-in-azure-devops\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2021\/09\/15\/tagging-containers-in-azure-devops\/#primaryimage","url":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2021\/09\/tom-radetzki-idRpmZVNs30-unsplash-scaled.jpg","contentUrl":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2021\/09\/tom-radetzki-idRpmZVNs30-unsplash-scaled.jpg","width":2560,"height":1247,"caption":"conspiracy"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2021\/09\/15\/tagging-containers-in-azure-devops\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.wiseowls.co.nz\/"},{"@type":"ListItem","position":2,"name":"Things they don&#8217;t tell you &#8211; Tagging containers in Azure DevOps"}]},{"@type":"WebSite","@id":"https:\/\/blog.wiseowls.co.nz\/#website","url":"https:\/\/blog.wiseowls.co.nz\/","name":"Timur and associates","description":"Notes of an IT contractor","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.wiseowls.co.nz\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blog.wiseowls.co.nz\/#\/schema\/person\/34d0ed30d573b5bc317ea990bd2e0c59","name":"timur","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg","url":"https:\/\/secure.gravatar.com\/avatar\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg","caption":"timur"},"sameAs":["https:\/\/x.com\/TimurKh"]}]}},"_links":{"self":[{"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/posts\/919","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/comments?post=919"}],"version-history":[{"count":9,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/posts\/919\/revisions"}],"predecessor-version":[{"id":972,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/posts\/919\/revisions\/972"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/media\/925"}],"wp:attachment":[{"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/media?parent=919"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/categories?post=919"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/tags?post=919"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}