{"id":942,"date":"2019-10-04T12:21:48","date_gmt":"2019-10-04T10:21:48","guid":{"rendered":"http:\/\/blog.zhaw.ch\/splab\/?p=942"},"modified":"2019-10-04T16:46:05","modified_gmt":"2019-10-04T14:46:05","slug":"introducing-the-docker-compose-validator","status":"publish","type":"post","link":"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/","title":{"rendered":"Introducing the Docker Compose Validator"},"content":{"rendered":"\n<p>When cloud application developers are working with <code>docker-compose<\/code> to combine multiple microservices into a single manageable entity, they can make some easy mistakes. To prevent these mistakes, they can rely on internal validation logic, which however does not catch many of the typical issues. Therefore, researchers at the <a href=\"https:\/\/blog.zhaw.ch\/splab\/\">Service Prototyping Lab<\/a> at Zurich University of Applied Sciences wrote a dedicated quality check and assessment tool targeting developers, but also students trying to learn the technology, which has a wider range of checks. The DCValidator tool is available as a web application (<a href=\"http:\/\/160.85.252.231:3000\/\">see demo instance<\/a>) or command-line interface. This blog post describes how to check that docker-compose files are free of issues.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"524\" src=\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-26-13-24-14-1-1024x524.png\" alt=\"\" class=\"wp-image-950\" srcset=\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-26-13-24-14-1-1024x524.png 1024w, https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-26-13-24-14-1-300x154.png 300w, https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-26-13-24-14-1-768x393.png 768w, https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-26-13-24-14-1-676x346.png 676w, https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-26-13-24-14-1.png 1853w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>docker-compose validator Web interface<\/figcaption><\/figure>\n\n\n\n<!--more-->\n\n\n\n<p>One might ask what is the purpose of this tool when there is the built-in docker-compose validator? This validator unfortunately fails to validate many issues. For example, duplicate keys that result from copy &amp; paste actions, which are incredibly common during the creation of the arguably complex <a href=\"https:\/\/docs.docker.com\/compose\/compose-file\/\">YAML compose files<\/a>. The built-in YAML parser of docker-compose by default ignores the duplicate keys. Imagine that you have some services in your compose file and two of them have the same name but they are different services. In this case, you will lose one of your services and this is not good news! Similar duplication issues exist for port allocations.<\/p>\n\n\n\n<p>Before we start, let us talk about some common mistakes that developers and students make.<br> 1- The most common things are typo mistakes. <br> 2- Duplicate keys and tags that we mentioned before are another kind of mistakes we can make<br> 3- And some mistakes in values of keys.<\/p>\n\n\n\n<p>Let&#8217;s see an example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>version: '3'\n\nservices:\n  app:\n    build: \n      context: .\n      args:\n        - IMAGE_VERSION=3.7.0-alpine3.8\n    image: takacsmark\/flask-redis:1.0\n    env_file: .env.txt\n    ports:\n      - 80:5000\n      - 80:5000\n    dns: 888.888.8888\n    networks:\n      - mynet\n  app2:\n    image: ubuntu:latest\n    command: [\"tail\", \"-f\", \"\/dev\/null\"]\n  redis:\n    imge: redis:4.0.11-alpine\n    networks:\n      - mynet\n    volume:\n      - mydata:\/data\n\nnetwork:\n  mynet:\nvolumes:\n  mydata:<\/code><\/pre>\n\n\n\n<p>In this case, we have duplicate ports, typo mistake, and bad DNS. These issues can be found out with the <a href=\"https:\/\/github.com\/serviceprototypinglab\">Docker Compose Validator<\/a>, as explained by the video below.<\/p>\n\n\n<figure class=\"wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"lyte-wrapper\" title=\"Validating and Quality-Checking Docker Compose Files\" style=\"width:640px;max-width:100%;margin:5px;\"><div class=\"lyMe\" id=\"WYL_eMGaPMSJi3g\"><div id=\"lyte_eMGaPMSJi3g\" data-src=\"https:\/\/blog.zhaw.ch\/splab\/wp-content\/plugins\/wp-youtube-lyte\/lyteCache.php?origThumbUrl=https%3A%2F%2Fi.ytimg.com%2Fvi%2FeMGaPMSJi3g%2Fhqdefault.jpg\" class=\"pL\"><div class=\"tC\"><div class=\"tT\">Validating and Quality-Checking Docker Compose Files<\/div><\/div><div class=\"play\"><\/div><div class=\"ctrl\"><div class=\"Lctrl\"><\/div><div class=\"Rctrl\"><\/div><\/div><\/div><noscript><a href=\"https:\/\/youtu.be\/eMGaPMSJi3g\" rel=\"nofollow\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.zhaw.ch\/splab\/wp-content\/plugins\/wp-youtube-lyte\/lyteCache.php?origThumbUrl=https%3A%2F%2Fi.ytimg.com%2Fvi%2FeMGaPMSJi3g%2F0.jpg\" alt=\"Validating and Quality-Checking Docker Compose Files\" width=\"640\" height=\"340\" \/><br \/>Watch this video on YouTube<\/a><\/noscript><\/div><\/div><div class=\"lL\" style=\"max-width:100%;width:640px;margin:5px;\"><br\/><span class=\"lyte_disclaimer\">Defaulttext aus wp-youtube-lyte.php<\/span><\/div><figcaption><\/figcaption><\/figure>\n\n\n<p>Sometimes you are working on a project and for validating your docker-compose it&#8217;s a nightmare using web application! We anticipate batch use (e.g. for CI\/CD integration or developer preference for terminals) and because of that, there is a CLI!<\/p>\n\n\n\n<p>When you run the script you may see something like this:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"134\" src=\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-27-11-51-31-1024x134.png\" alt=\"\" class=\"wp-image-949\" srcset=\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-27-11-51-31-1024x134.png 1024w, https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-27-11-51-31-300x39.png 300w, https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-27-11-51-31-768x101.png 768w, https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-27-11-51-31-676x89.png 676w, https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-27-11-51-31.png 1359w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>docker-compose validator CLI<\/figcaption><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>$ python validator-cli.py\n\n\nWarning: no kafka support\nSyntax: validator-cli.py [-a &lt;org&gt;\/&lt;basepath&gt;] [-f &lt;file&gt;] [-u &lt;url&gt;] [-e &lt;kafka&gt;\/&lt;space&gt;\/&lt;series&gt;]\n -a: autosearch; find appropriate compose files on GitHub\n -f: filebased; load docker-compose from a docker-compose file\n -fl: filebased list; load paths or URLs as lines from a text file\n -u: urlbased; direct URL or path specification\n -e: eventing; send results to Kafka endpoint with space and series selection\n -fi: filters; you can select filters as any as you want:\n    for more info flag --fih might be helpful!\nExample: validator-cli.py -a elastest\/deploy -e kafka.cloudlab.zhaw.ch\/user-1-docker_label_consistency\/nightly -fi 'Duplicate Keys,Top level property'<\/code><\/pre>\n\n\n\n<p>And when we passed our docker-compose file to the script, we got this result:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"313\" src=\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-27-11-55-41-1-1024x313.png\" alt=\"\" class=\"wp-image-951\" srcset=\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-27-11-55-41-1-1024x313.png 1024w, https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-27-11-55-41-1-300x92.png 300w, https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-27-11-55-41-1-768x235.png 768w, https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-27-11-55-41-1-676x206.png 676w, https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-27-11-55-41-1.png 1837w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>result of validator<\/figcaption><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>$ python validator-cli.py -u https:\/\/github.com\/alidaghighi\/docker-compose-test-cases\/blob\/master\/Bad%20test%20case%202\/docker-compose.yml -fi 'Duplicate Keys,Duplicate ports,Typing mistakes,DNS,Duplicate expose'\nWarning: no kafka support\nloading cache...\nloading compose files....\nchecking consistency...\nsyntax is ok\n=================== ERROR ===================\nI can not find 'network' tag. Maybe you can use: \nnetworks\n\n=============================================\n= type: docker-compose\n- service:app\nDuplicate ports in service app port 80\n=================== ERROR ===================\nUnder service: app\nThe DNS is not appropriate!\n=============================================\n- service:app2\n- service:redis\n=================== ERROR ===================\nI can not find 'imge' tag under 'redis' service. Maybe you can use: \nimage\nI can not find 'volume' tag under 'redis' service. Maybe you can use: \nvolumes\n=============================================\nservices: 3\nlabels:\ntime: 0.0s\nnot sending message... {'agent': 'sentinel-generic-agent', 'services': 3.0, 'faulty:docker-compose-test-cases': 0.0}<\/code><\/pre>\n\n\n\n<p>Feel free to use and contribute! The code is available on the lab&#8217;s <a href=\"https:\/\/github.com\/serviceprototypinglab\/dcvalidator\">Git repository<\/a>.<\/p>\n<div class=\"pt-sm\">Schlagw\u00f6rter: <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/docker\/\">docker<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/docker-compose\/\">docker-compose<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/maomao\/\">maomao<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/quality\/\">quality<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/tool\/\">tool<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/validation\/\">validation<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/web-application\/\">web application<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/yaml\/\">yaml<\/a><br><\/div>","protected":false},"excerpt":{"rendered":"<p>When cloud application developers are working with docker-compose to combine multiple microservices into a single manageable entity, they can make some easy mistakes. To prevent these mistakes, they can rely on internal validation logic, which however does not catch many of the typical issues. Therefore, researchers at the Service Prototyping Lab at Zurich University of [&hellip;]<\/p>\n","protected":false},"author":498,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[4],"tags":[44,105,37,85,109,106,108,107],"features":[],"class_list":["post-942","post","type-post","status-publish","format-standard","hentry","category-research","tag-docker","tag-docker-compose","tag-maomao","tag-quality","tag-tool","tag-validation","tag-web-application","tag-yaml"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Introducing the Docker Compose Validator - Service Prototyping Lab<\/title>\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.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Introducing the Docker Compose Validator\" \/>\n<meta property=\"og:description\" content=\"When cloud application developers are working with docker-compose to combine multiple microservices into a single manageable entity, they can make some easy mistakes. To prevent these mistakes, they can rely on internal validation logic, which however does not catch many of the typical issues. Therefore, researchers at the Service Prototyping Lab at Zurich University of [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/\" \/>\n<meta property=\"og:site_name\" content=\"Service Prototyping Lab\" \/>\n<meta property=\"article:published_time\" content=\"2019-10-04T10:21:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-10-04T14:46:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-26-13-24-14-1-1024x524.png\" \/>\n<meta name=\"author\" content=\"dagh\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"dagh\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/\"},\"author\":{\"name\":\"dagh\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/1d72b281c9b8fd028b24569c7617917e\"},\"headline\":\"Introducing the Docker Compose Validator\",\"datePublished\":\"2019-10-04T10:21:48+00:00\",\"dateModified\":\"2019-10-04T14:46:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/\"},\"wordCount\":410,\"commentCount\":1,\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-26-13-24-14-1-1024x524.png\",\"keywords\":[\"docker\",\"docker-compose\",\"maomao\",\"quality\",\"tool\",\"validation\",\"web application\",\"yaml\"],\"articleSection\":[\"Research\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/\",\"url\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/\",\"name\":\"Introducing the Docker Compose Validator - Service Prototyping Lab\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-26-13-24-14-1-1024x524.png\",\"datePublished\":\"2019-10-04T10:21:48+00:00\",\"dateModified\":\"2019-10-04T14:46:05+00:00\",\"author\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/1d72b281c9b8fd028b24569c7617917e\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/#primaryimage\",\"url\":\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-26-13-24-14-1-1024x524.png\",\"contentUrl\":\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-26-13-24-14-1-1024x524.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/blog.zhaw.ch\/splab\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Introducing the Docker Compose Validator\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#website\",\"url\":\"https:\/\/blog.zhaw.ch\/splab\/\",\"name\":\"Service Prototyping Lab\",\"description\":\"A Blog of the ZHAW Zurich University of Applied Sciences\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.zhaw.ch\/splab\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/1d72b281c9b8fd028b24569c7617917e\",\"name\":\"dagh\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/2feb9a960f156a716f44fba2ab35cb2d2edf5d129d03420d00cdf5c20d011e5d?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/2feb9a960f156a716f44fba2ab35cb2d2edf5d129d03420d00cdf5c20d011e5d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/2feb9a960f156a716f44fba2ab35cb2d2edf5d129d03420d00cdf5c20d011e5d?s=96&d=mm&r=g\",\"caption\":\"dagh\"},\"url\":\"https:\/\/blog.zhaw.ch\/splab\/author\/dagh\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Introducing the Docker Compose Validator - Service Prototyping Lab","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.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/","og_locale":"en_GB","og_type":"article","og_title":"Introducing the Docker Compose Validator","og_description":"When cloud application developers are working with docker-compose to combine multiple microservices into a single manageable entity, they can make some easy mistakes. To prevent these mistakes, they can rely on internal validation logic, which however does not catch many of the typical issues. Therefore, researchers at the Service Prototyping Lab at Zurich University of [&hellip;]","og_url":"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/","og_site_name":"Service Prototyping Lab","article_published_time":"2019-10-04T10:21:48+00:00","article_modified_time":"2019-10-04T14:46:05+00:00","og_image":[{"url":"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-26-13-24-14-1-1024x524.png","type":"","width":"","height":""}],"author":"dagh","twitter_card":"summary_large_image","twitter_misc":{"Written by":"dagh","Estimated reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/#article","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/"},"author":{"name":"dagh","@id":"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/1d72b281c9b8fd028b24569c7617917e"},"headline":"Introducing the Docker Compose Validator","datePublished":"2019-10-04T10:21:48+00:00","dateModified":"2019-10-04T14:46:05+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/"},"wordCount":410,"commentCount":1,"image":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-26-13-24-14-1-1024x524.png","keywords":["docker","docker-compose","maomao","quality","tool","validation","web application","yaml"],"articleSection":["Research"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/","url":"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/","name":"Introducing the Docker Compose Validator - Service Prototyping Lab","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/splab\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/#primaryimage"},"image":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-26-13-24-14-1-1024x524.png","datePublished":"2019-10-04T10:21:48+00:00","dateModified":"2019-10-04T14:46:05+00:00","author":{"@id":"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/1d72b281c9b8fd028b24569c7617917e"},"breadcrumb":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/#primaryimage","url":"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-26-13-24-14-1-1024x524.png","contentUrl":"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/09\/Screenshot-from-2019-09-26-13-24-14-1-1024x524.png"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/10\/04\/introducing-the-docker-compose-validator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/blog.zhaw.ch\/splab\/"},{"@type":"ListItem","position":2,"name":"Introducing the Docker Compose Validator"}]},{"@type":"WebSite","@id":"https:\/\/blog.zhaw.ch\/splab\/#website","url":"https:\/\/blog.zhaw.ch\/splab\/","name":"Service Prototyping Lab","description":"A Blog of the ZHAW Zurich University of Applied Sciences","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.zhaw.ch\/splab\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Person","@id":"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/1d72b281c9b8fd028b24569c7617917e","name":"dagh","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/2feb9a960f156a716f44fba2ab35cb2d2edf5d129d03420d00cdf5c20d011e5d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2feb9a960f156a716f44fba2ab35cb2d2edf5d129d03420d00cdf5c20d011e5d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2feb9a960f156a716f44fba2ab35cb2d2edf5d129d03420d00cdf5c20d011e5d?s=96&d=mm&r=g","caption":"dagh"},"url":"https:\/\/blog.zhaw.ch\/splab\/author\/dagh\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/posts\/942","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/users\/498"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/comments?post=942"}],"version-history":[{"count":10,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/posts\/942\/revisions"}],"predecessor-version":[{"id":969,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/posts\/942\/revisions\/969"}],"wp:attachment":[{"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/media?parent=942"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/categories?post=942"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/tags?post=942"},{"taxonomy":"features","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/features?post=942"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}