{"id":11026,"date":"2016-12-20T11:30:25","date_gmt":"2016-12-20T09:30:25","guid":{"rendered":"https:\/\/blog.zhaw.ch\/icclab\/?p=11026"},"modified":"2021-03-04T18:51:25","modified_gmt":"2021-03-04T16:51:25","slug":"the-intricacies-of-running-containers-on-openshift","status":"publish","type":"post","link":"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/","title":{"rendered":"The intricacies of running containers on OpenShift"},"content":{"rendered":"\n<p>by <a href=\"https:\/\/blog.zhaw.ch\/icclab\/josef-spillner\/\">Josef Spillner<\/a><\/p>\n\n\n<p>In the context of the <a href=\"https:\/\/blog.zhaw.ch\/icclab\/enterprise-cloud-robotics-platform-transfer-project\/\">ECRP Project<\/a>, &nbsp;which is part of our <a href=\"https:\/\/blog.zhaw.ch\/icclab\/category\/research-approach\/themes\/cloud-robotics\">cloud robotics initiative<\/a>, we are aiming to build a PaaS solution for robotic applications.<\/p>\n<p>The \u201cRobot Operating System\u201d (<a href=\"http:\/\/www.ros.org\/\">ROS<\/a>) is widely used on several robotics platforms, and also runs on the turtlebot robots in our lab. One of the ideas behind cloud robotics is to enable ROS components (so called ROS nodes) to run distributed across the cloud infrastructure and the robot itself, so we can shift certain parts of the robotics application to the cloud. As a logical first step we tried to run existing ROS nodes, such as a ROS master in <a href=\"https:\/\/blog.zhaw.ch\/icclab\/challenges-with-running-ros-on-kubernetes\/\">containers on Kubernetes<\/a>, then we tried to use a proper Platform as a Service (PaaS) solution, in our case Red Hat OpenShift .<\/p>\n<p>OpenShift offers a full PaaS experience, you can build and run code from source or run pre-built containers directly. All of those features can be managed via a intuitive web interface.<\/p>\n<p><a href=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/12\/ops_rosmaster.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-11087\" src=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/12\/ops_rosmaster-1024x588.png\" alt=\"\" width=\"584\" height=\"335\" srcset=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/12\/ops_rosmaster-1024x588.png 1024w, https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/12\/ops_rosmaster-300x172.png 300w, https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/12\/ops_rosmaster-768x441.png 768w, https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/12\/ops_rosmaster-500x287.png 500w, https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/12\/ops_rosmaster.png 1917w\" sizes=\"auto, (max-width: 584px) 100vw, 584px\" \/><\/a><\/p>\n<p>However, OpenShift imposes tight security restrictions on the containers it runs.<br>\nThese are:<\/p>\n<ul>\n<li>Prevention from running processes in containers as root<\/li>\n<li>Using random user ID for running containers (<a href=\"https:\/\/docs.openshift.org\/latest\/creating_images\/guidelines.html#use-uid\">Support Arbitrary User IDs<\/a>)<\/li>\n<\/ul>\n<p><!--more-->As a cluster admin you are able to specify and <a href=\"https:\/\/docs.openshift.com\/enterprise\/3.0\/admin_guide\/manage_scc.html#how-do-i\">manage the security context<\/a> constraints, which allow you to specify granular security constraints for tenants. With such rules an administrator is able to specify which users are allowed to run containers under specific&nbsp; constraints. Therefore the strict security restriction can be relaxed if needed. We focus here on a standard configuration, in which those security restrictions are fully enabled and we act as normal user which has no special roles and permissions assigned.<\/p>\n<p>For ROS containers the prevention of running processes as root is not a big issue, because ROS components are intended not to require root permissions in general. Nevertheless by default the existing ROS containers run all their processes as root.<\/p>\n<p>So our first step in adapting a generic container from Docker Hub to run on OpenShift was to repackage the container and switch to a non root user leveraging the USER statement inside the Dockerfile.<\/p>\n<pre><code>FROM ros:indigo\n# install\nRUN apt-get update &amp;&amp; apt-get install -y ros-indigo-move-base-msgs\n\n# setup entrypoint\nADD .\/ros_entrypoint.sh \/\n\n# add user\nRUN adduser --disabled-password rosuser\n<strong>USER rosuser<\/strong>\n\nENTRYPOINT [\"\/ros_entrypoint.sh\"]\nCMD [\"\/bin\/bash\", \"-c\",\"\/ros_entrypoint.sh roscore\"]\n<\/code><\/pre>\n<p>However, this is not enough. The container still does not run properly and crashes shortly after starting it. This is due to the fact that OpenShift uses a random user ID at runtime to run containers. In our case, the ROS master node tries to write its log files to a directory owned by the user we defined in the Dockerfile, however the userid of the user that is running the container and the userid that we used for setting up the container differ, hence the user at runtime has insufficient permissions to write on the Dockerfile user directories. This is a know issue, and a detailed treatment of the problem and how to solve it can be found in this blog post from Graham Dumpleton: <a href=\"http:\/\/blog.dscpl.com.au\/2015\/12\/random-user-ids-when-running-docker.html\">http:\/\/blog.dscpl.com.au\/2015\/12\/random-user-ids-when-running-docker.html<\/a><br>\nIn this blogpost we just give a quick solution that works.<\/p>\n<p>One way to fix the permission problem would be to give write access to the world to the logging directory. We don\u2019t really like this solution and it would also be slightly odd if the result of a focus on security was the requirement of opening up permissions to everybody.<\/p>\n<p>The other way to go are group permissions. But we also can\u2019t just create a new group and add the user to it, because the random user which is used at runtime can not be added to this group before. So the trick is to look at the standard group of the random user. If we run the \u201cid\u201d command we can see that this random user is always in the group \u201croot\u201d with the id 0.<\/p>\n<p><a href=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/12\/id_cmd.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-11054\" src=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/12\/id_cmd-300x34.png\" alt=\"\" width=\"300\" height=\"34\" srcset=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/12\/id_cmd-300x34.png 300w, https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/12\/id_cmd.png 317w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>The solution is therefore to create a user which has also the group \u201croot\u201d as standard group defined. This way we can ensure that every directory which is created by that user is also writable by the random user at runtime.<\/p>\n<p>The modified Dockerfile would look something like this:<\/p>\n<pre><code># add user and make sure her stuff is writable \n# whichever userid is given at runtime\nRUN adduser --disabled-password --gid 0 --gecos \"ROS user\" rosuser\nUSER rosuser\nRUN chown rosuser:root \/home\/rosuser &amp;&amp; chmod 0775 \/home\/rosuser\nENV HOME \/home\/rosuser\n<\/code><\/pre>\n<p>The required steps are:<\/p>\n<ul>\n<li>Add a user with the gid of 0, which is the \u201croot\u201d group<\/li>\n<li>Switch to the newly created user<\/li>\n<li>Change the ownership and the permission of the home directory to the current user and \u201croot\u201d group.<\/li>\n<li>Set the HOME environment variable to the current home dir of the user. This way also the random user has his home set to the same directory<\/li>\n<\/ul>\n<p>With these changes we were able to run ROS containers on OpenShift. Also any other container which was firstly designed to run as root, can be modified this way to run on OpenShift. The downside is, you still need to manually change the ownership and permissions on every directory you will need at runtime.<\/p><div class=\"pt-sm\">Schlagw\u00f6rter: <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/cloud-robotics\/\">cloud robotics<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/docker\/\">docker<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/openshift\/\">openshift<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/ros\/\">ROS<\/a><br><\/div>","protected":false},"excerpt":{"rendered":"<p>In the context of the ECRP Project, &nbsp;which is part of our cloud robotics initiative, we are aiming to build a PaaS solution for robotic applications. The \u201cRobot Operating System\u201d (ROS) is widely used on several robotics platforms, and also runs on the turtlebot robots in our lab. One of the ideas behind cloud robotics [&hellip;]<\/p>\n","protected":false},"author":486,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[1,943,15],"tags":[743,484,238,741],"features":[],"class_list":["post-11026","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-cloud-robotics-articles","category-howtos","tag-cloud-robotics","tag-docker","tag-openshift","tag-ros"],"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>The intricacies of running containers on OpenShift - Service Engineering (ICCLab &amp; SPLab)<\/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\/icclab\/the-intricacies-of-running-containers-on-openshift\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"The intricacies of running containers on OpenShift\" \/>\n<meta property=\"og:description\" content=\"In the context of the ECRP Project, &nbsp;which is part of our cloud robotics initiative, we are aiming to build a PaaS solution for robotic applications. The \u201cRobot Operating System\u201d (ROS) is widely used on several robotics platforms, and also runs on the turtlebot robots in our lab. One of the ideas behind cloud robotics [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/\" \/>\n<meta property=\"og:site_name\" content=\"Service Engineering (ICCLab &amp; SPLab)\" \/>\n<meta property=\"article:published_time\" content=\"2016-12-20T09:30:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-03-04T16:51:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/12\/ops_rosmaster-1024x588.png\" \/>\n<meta name=\"author\" content=\"icclab\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"icclab\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. 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\/icclab\/the-intricacies-of-running-containers-on-openshift\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/\"},\"author\":{\"name\":\"icclab\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563\"},\"headline\":\"The intricacies of running containers on OpenShift\",\"datePublished\":\"2016-12-20T09:30:25+00:00\",\"dateModified\":\"2021-03-04T16:51:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/\"},\"wordCount\":799,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/12\/ops_rosmaster-1024x588.png\",\"keywords\":[\"cloud robotics\",\"docker\",\"openshift\",\"ROS\"],\"articleSection\":[\"*.*\",\"Cloud Robotics\",\"HowTos\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/\",\"name\":\"The intricacies of running containers on OpenShift - Service Engineering (ICCLab &amp; SPLab)\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/12\/ops_rosmaster-1024x588.png\",\"datePublished\":\"2016-12-20T09:30:25+00:00\",\"dateModified\":\"2021-03-04T16:51:25+00:00\",\"author\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/#primaryimage\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/12\/ops_rosmaster.png\",\"contentUrl\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/12\/ops_rosmaster.png\",\"width\":1917,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/blog.zhaw.ch\/icclab\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"The intricacies of running containers on OpenShift\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#website\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/\",\"name\":\"Service Engineering (ICCLab &amp; SPLab)\",\"description\":\"A Blog of the ZHAW Zurich University of Applied Sciences\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.zhaw.ch\/icclab\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563\",\"name\":\"icclab\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g\",\"caption\":\"icclab\"},\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/author\/icclab\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"The intricacies of running containers on OpenShift - Service Engineering (ICCLab &amp; SPLab)","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\/icclab\/the-intricacies-of-running-containers-on-openshift\/","og_locale":"en_US","og_type":"article","og_title":"The intricacies of running containers on OpenShift","og_description":"In the context of the ECRP Project, &nbsp;which is part of our cloud robotics initiative, we are aiming to build a PaaS solution for robotic applications. The \u201cRobot Operating System\u201d (ROS) is widely used on several robotics platforms, and also runs on the turtlebot robots in our lab. One of the ideas behind cloud robotics [&hellip;]","og_url":"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/","og_site_name":"Service Engineering (ICCLab &amp; SPLab)","article_published_time":"2016-12-20T09:30:25+00:00","article_modified_time":"2021-03-04T16:51:25+00:00","og_image":[{"url":"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/12\/ops_rosmaster-1024x588.png","type":"","width":"","height":""}],"author":"icclab","twitter_card":"summary_large_image","twitter_misc":{"Written by":"icclab","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/#article","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/"},"author":{"name":"icclab","@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563"},"headline":"The intricacies of running containers on OpenShift","datePublished":"2016-12-20T09:30:25+00:00","dateModified":"2021-03-04T16:51:25+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/"},"wordCount":799,"commentCount":0,"image":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/12\/ops_rosmaster-1024x588.png","keywords":["cloud robotics","docker","openshift","ROS"],"articleSection":["*.*","Cloud Robotics","HowTos"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/","url":"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/","name":"The intricacies of running containers on OpenShift - Service Engineering (ICCLab &amp; SPLab)","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/#primaryimage"},"image":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/12\/ops_rosmaster-1024x588.png","datePublished":"2016-12-20T09:30:25+00:00","dateModified":"2021-03-04T16:51:25+00:00","author":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563"},"breadcrumb":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/#primaryimage","url":"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/12\/ops_rosmaster.png","contentUrl":"https:\/\/blog.zhaw.ch\/icclab\/files\/2016\/12\/ops_rosmaster.png","width":1917,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/blog.zhaw.ch\/icclab\/the-intricacies-of-running-containers-on-openshift\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/blog.zhaw.ch\/icclab\/"},{"@type":"ListItem","position":2,"name":"The intricacies of running containers on OpenShift"}]},{"@type":"WebSite","@id":"https:\/\/blog.zhaw.ch\/icclab\/#website","url":"https:\/\/blog.zhaw.ch\/icclab\/","name":"Service Engineering (ICCLab &amp; SPLab)","description":"A Blog of the ZHAW Zurich University of Applied Sciences","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.zhaw.ch\/icclab\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563","name":"icclab","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g","caption":"icclab"},"url":"https:\/\/blog.zhaw.ch\/icclab\/author\/icclab\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/11026","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/users\/486"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/comments?post=11026"}],"version-history":[{"count":47,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/11026\/revisions"}],"predecessor-version":[{"id":12480,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/11026\/revisions\/12480"}],"wp:attachment":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/media?parent=11026"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/categories?post=11026"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/tags?post=11026"},{"taxonomy":"features","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/features?post=11026"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}