{"id":1056,"date":"2019-11-15T15:54:49","date_gmt":"2019-11-15T14:54:49","guid":{"rendered":"http:\/\/blog.zhaw.ch\/splab\/?p=1056"},"modified":"2019-11-16T00:05:29","modified_gmt":"2019-11-15T23:05:29","slug":"docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance","status":"publish","type":"post","link":"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/","title":{"rendered":"Docker image checks: Quality, security, up-to-dateness, layers and inheritance"},"content":{"rendered":"\n<p>Docker images have become the valuta franca in the cloud and container platform world. Although on the path to vendor-neutral standardisation (e.g. with <a href=\"https:\/\/github.com\/opencontainers\/image-spec\">OCI<\/a> also being in <a href=\"https:\/\/www.opencontainers.org\/blog\/2018\/10\/11\/oci-image-support-comes-to-open-source-docker-registry\">Docker Hub<\/a> for a year now), developers for now have settled on plain Docker as de-facto standard due to the <a href=\"https:\/\/hub.docker.com\/search?q=&amp;type=image\">vast ecosystem<\/a> of base images and dependency images which speed up the rapid prototyping of complex scalable applications. From a production-grade DevOps perspective, a key concern is then to be assured that the containers used are of high quality, not infected by security vulnerabilities, and still containing the latest features available. In this blog post, a novel approach to visualise the situation around a particular container image is presented.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Existing containers are used in Container-as-a-Service (CaaS) platforms such as Kubernetes, OpenShift and Podman explicitly as lowest-level execution unit. Furthermore, they are also used as base images (in <a href=\"https:\/\/docs.docker.com\/develop\/develop-images\/dockerfile_best-practices\/\">Dockerfiles<\/a>) and as dependency images (in deployment descriptors, templates and compose files). Finally, containers are also transparently auto-built or auto-finalised (with volume mounts) in several Function-as-a-Service (FaaS) and Platform-as-a-Service (PaaS) environments. Any quality or <a href=\"https:\/\/snyk.io\/blog\/10-docker-image-security-best-practices\/\">security issue<\/a> with any container image may quickly invalidate any assumption about the stability and reliability of the container-based applications and services. Thus, better tools to check and represent the characteristics of container images are needed.<\/p>\n\n\n\n<p>For early development stages, there are validation tools such as <a href=\"https:\/\/thepracticalsysadmin.com\/lint-your-dockerfiles-with-hadolint\/\">Hadolint<\/a> and <a href=\"https:\/\/github.com\/RedCoolBeans\/dockerlint\/\">Dockerlint<\/a> to find programming issues in Dockerfiles, ranging from unconventional shell commands to forgotten maintainer information. For later testing stages, there are more tools such as <a href=\"https:\/\/github.com\/quay\/clair\">Clair<\/a>, <a href=\"https:\/\/anchore.com\/opensource\/\">Anchore<\/a> and the research-proposed DIVA to find runtime stability issues and security vulnerabilities. The tools have certain assumptions about how they are run &#8211; Clair for instance is not optimised to be invoked on demand as it downloads CVEs on startup. Instead, it is a long-running process (attached to an equally long-running PostgreSQL server) to which CLI tools connect for doing the actual work. There is for instance <a href=\"https:\/\/github.com\/joelee2012\/claircli\">claircli<\/a>, but the more suitable tool for integration into an artefact observation appears to be <a href=\"https:\/\/github.com\/arminc\/clair-scanner\">clair-scanner<\/a>. For that, a stand-alone variant suitable for CI\/CD integration exists with <a href=\"https:\/\/github.com\/arminc\/clair-local-scan\">clair-local-scan<\/a>. The tool pulls a local or remote container image, scans it against the most recent CVE database &#8211; if the image based on a supported operating system, outputs the potentially applying CVEs and returns a binary value indicating whether the image is free of issues.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/clairoutput.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"475\" src=\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/clairoutput-1024x475.png\" alt=\"\" class=\"wp-image-1062\" srcset=\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/clairoutput-1024x475.png 1024w, https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/clairoutput-300x139.png 300w, https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/clairoutput-768x356.png 768w, https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/clairoutput-676x314.png 676w, https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/clairoutput.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Output of Docker image security scanner Clair<\/figcaption><\/figure>\n\n\n\n<p>Sometimes, it is not clear which layer an issue comes from, <a href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/#\/maintainer-deprecated\">who is responsible<\/a> for fixing it and which other images may be infected by the issue. While there are some tools to deal with the issue, their results are not satisfactory. The <code>docker images --tree<\/code> command is deprecated, and the often-recommended <code>chenzj\/dfimage<\/code> container, while nicely concatenating build instructions across the entire history, does not exploit the knowledge about tagged images, nor integrates with external knowledge sources. Enter <code>inheritancetree.sh<\/code>. This script analyses a Docker image&#8217;s build history, reconstructing (as far as possible) the layers and their origin as tagged images, and generates a graph representation. Moreover, the script consults two oracles to provide more information: The <a href=\"https:\/\/docs.docker.com\/registry\/spec\/api\/\">Docker Hub API<\/a>, to get information whether a tagged layer is still up-to-date with regards to the currently published layer for the same tag (and architecture), and a locally running Clair security scanner as described above.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"236\" src=\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/docker-clair.png\" alt=\"\" class=\"wp-image-1073\" srcset=\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/docker-clair.png 800w, https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/docker-clair-300x89.png 300w, https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/docker-clair-768x227.png 768w, https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/docker-clair-676x199.png 676w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption>Inheritance tree for two not locally built container images, one secure and one vulnerable according to Clair.<\/figcaption><\/figure>\n\n\n\n<p>The script automatically picks up installed tools to build up its information sources. A helper script is provided to run the dockerised version of Clair properly. Colouring and labelling is used to provide an easy overview about the state of the image and its ancestry down to the virtual <code>scratch<\/code> <a href=\"https:\/\/docs.docker.com\/develop\/develop-images\/baseimages\/\">base image<\/a>. Labels include (outdated) versus (up-to-date) and (vulnerable!) versus (secure).<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><a href=\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/snafucomplete.png\"><img loading=\"lazy\" decoding=\"async\" width=\"264\" height=\"1024\" src=\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/snafucomplete-264x1024.png\" alt=\"\" class=\"wp-image-1064\" srcset=\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/snafucomplete-264x1024.png 264w, https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/snafucomplete-77x300.png 77w, https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/snafucomplete.png 408w\" sizes=\"auto, (max-width: 264px) 100vw, 264px\" \/><\/a><figcaption>Inheritance tree of (now outdated) locally built snafucomplete Docker image, with intermediate layers and information from Docker Hub and Clair merged into the graph<\/figcaption><\/figure><\/div>\n\n\n\n<p>The <code>inheritancetree.sh<\/code> script is <a href=\"https:\/\/github.com\/serviceprototypinglab\/docker-image-analysis\">available from Git<\/a>. On the applied research side, we continue to observe the chatacteristics and quality aspects of microservice implementation artefacts such as Docker container images to ensure that Swiss companies using such technologies get better insights into what is happening in their cloud application deployments.<\/p>\n<div class=\"pt-sm\">Schlagw\u00f6rter: <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/containers\/\">containers<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/docker\/\">docker<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/graph\/\">graph<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/maomao\/\">maomao<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/microservices\/\">microservices<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/quality\/\">quality<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/security\/\">security<\/a><br><\/div>","protected":false},"excerpt":{"rendered":"<p>Docker images have become the valuta franca in the cloud and container platform world. Although on the path to vendor-neutral standardisation (e.g. with OCI also being in Docker Hub for a year now), developers for now have settled on plain Docker as de-facto standard due to the vast ecosystem of base images and dependency images [&hellip;]<\/p>\n","protected":false},"author":203,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[4],"tags":[116,44,118,37,39,85,117],"features":[],"class_list":["post-1056","post","type-post","status-publish","format-standard","hentry","category-research","tag-containers","tag-docker","tag-graph","tag-maomao","tag-microservices","tag-quality","tag-security"],"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>Docker image checks: Quality, security, up-to-dateness, layers and inheritance - 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\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Docker image checks: Quality, security, up-to-dateness, layers and inheritance\" \/>\n<meta property=\"og:description\" content=\"Docker images have become the valuta franca in the cloud and container platform world. Although on the path to vendor-neutral standardisation (e.g. with OCI also being in Docker Hub for a year now), developers for now have settled on plain Docker as de-facto standard due to the vast ecosystem of base images and dependency images [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/\" \/>\n<meta property=\"og:site_name\" content=\"Service Prototyping Lab\" \/>\n<meta property=\"article:published_time\" content=\"2019-11-15T14:54:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-11-15T23:05:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/clairoutput-1024x475.png\" \/>\n<meta name=\"author\" content=\"Josef Spillner\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Josef Spillner\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 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\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/\"},\"author\":{\"name\":\"Josef Spillner\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/33a5227c6cc1fa3329279d33c3cc440e\"},\"headline\":\"Docker image checks: Quality, security, up-to-dateness, layers and inheritance\",\"datePublished\":\"2019-11-15T14:54:49+00:00\",\"dateModified\":\"2019-11-15T23:05:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/\"},\"wordCount\":710,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/clairoutput-1024x475.png\",\"keywords\":[\"containers\",\"docker\",\"graph\",\"maomao\",\"microservices\",\"quality\",\"security\"],\"articleSection\":[\"Research\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/\",\"url\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/\",\"name\":\"Docker image checks: Quality, security, up-to-dateness, layers and inheritance - Service Prototyping Lab\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/clairoutput-1024x475.png\",\"datePublished\":\"2019-11-15T14:54:49+00:00\",\"dateModified\":\"2019-11-15T23:05:29+00:00\",\"author\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/33a5227c6cc1fa3329279d33c3cc440e\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/#primaryimage\",\"url\":\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/clairoutput-1024x475.png\",\"contentUrl\":\"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/clairoutput-1024x475.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/blog.zhaw.ch\/splab\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Docker image checks: Quality, security, up-to-dateness, layers and inheritance\"}]},{\"@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\/33a5227c6cc1fa3329279d33c3cc440e\",\"name\":\"Josef Spillner\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/c57d7019e91373902c08eac230e003cb4f8498ecf68c9d119e9ecb82fdf6c400?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c57d7019e91373902c08eac230e003cb4f8498ecf68c9d119e9ecb82fdf6c400?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c57d7019e91373902c08eac230e003cb4f8498ecf68c9d119e9ecb82fdf6c400?s=96&d=mm&r=g\",\"caption\":\"Josef Spillner\"},\"description\":\"Head of the Service Prototyping Lab. Research on distributed systems and application computing paradigms. Senior lecturer at Zurich University of Applied Sciences.\",\"url\":\"https:\/\/blog.zhaw.ch\/splab\/author\/spio\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Docker image checks: Quality, security, up-to-dateness, layers and inheritance - 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\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/","og_locale":"en_GB","og_type":"article","og_title":"Docker image checks: Quality, security, up-to-dateness, layers and inheritance","og_description":"Docker images have become the valuta franca in the cloud and container platform world. Although on the path to vendor-neutral standardisation (e.g. with OCI also being in Docker Hub for a year now), developers for now have settled on plain Docker as de-facto standard due to the vast ecosystem of base images and dependency images [&hellip;]","og_url":"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/","og_site_name":"Service Prototyping Lab","article_published_time":"2019-11-15T14:54:49+00:00","article_modified_time":"2019-11-15T23:05:29+00:00","og_image":[{"url":"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/clairoutput-1024x475.png","type":"","width":"","height":""}],"author":"Josef Spillner","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Josef Spillner","Estimated reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/#article","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/"},"author":{"name":"Josef Spillner","@id":"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/33a5227c6cc1fa3329279d33c3cc440e"},"headline":"Docker image checks: Quality, security, up-to-dateness, layers and inheritance","datePublished":"2019-11-15T14:54:49+00:00","dateModified":"2019-11-15T23:05:29+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/"},"wordCount":710,"commentCount":0,"image":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/clairoutput-1024x475.png","keywords":["containers","docker","graph","maomao","microservices","quality","security"],"articleSection":["Research"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/","url":"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/","name":"Docker image checks: Quality, security, up-to-dateness, layers and inheritance - Service Prototyping Lab","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/splab\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/#primaryimage"},"image":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/clairoutput-1024x475.png","datePublished":"2019-11-15T14:54:49+00:00","dateModified":"2019-11-15T23:05:29+00:00","author":{"@id":"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/33a5227c6cc1fa3329279d33c3cc440e"},"breadcrumb":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/#primaryimage","url":"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/clairoutput-1024x475.png","contentUrl":"https:\/\/blog.zhaw.ch\/splab\/files\/2019\/11\/clairoutput-1024x475.png"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/11\/15\/docker-image-checks-quality-security-up-to-dateness-layers-and-inheritance\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/blog.zhaw.ch\/splab\/"},{"@type":"ListItem","position":2,"name":"Docker image checks: Quality, security, up-to-dateness, layers and inheritance"}]},{"@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\/33a5227c6cc1fa3329279d33c3cc440e","name":"Josef Spillner","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/c57d7019e91373902c08eac230e003cb4f8498ecf68c9d119e9ecb82fdf6c400?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c57d7019e91373902c08eac230e003cb4f8498ecf68c9d119e9ecb82fdf6c400?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c57d7019e91373902c08eac230e003cb4f8498ecf68c9d119e9ecb82fdf6c400?s=96&d=mm&r=g","caption":"Josef Spillner"},"description":"Head of the Service Prototyping Lab. Research on distributed systems and application computing paradigms. Senior lecturer at Zurich University of Applied Sciences.","url":"https:\/\/blog.zhaw.ch\/splab\/author\/spio\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/posts\/1056","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\/203"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/comments?post=1056"}],"version-history":[{"count":14,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/posts\/1056\/revisions"}],"predecessor-version":[{"id":1078,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/posts\/1056\/revisions\/1078"}],"wp:attachment":[{"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/media?parent=1056"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/categories?post=1056"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/tags?post=1056"},{"taxonomy":"features","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/features?post=1056"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}