{"id":52071,"date":"2020-02-18T05:34:24","date_gmt":"2020-02-18T02:34:24","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy"},"modified":"2020-02-18T05:34:24","modified_gmt":"2020-02-18T02:34:24","slug":"horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","title":{"rendered":"Think carefully before using Docker-in-Docker for CI or testing environments.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Think carefully before using Docker-in-Docker for CI or testing environments.\" src=\"\/wp-content\/uploads\/2020\/02\/50b03664f1984b36e1703717dfaa7ecc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDocker-in-Docker is a virtualized Docker daemon environment running within a container to build container images. The primary aim of creating Docker-in-Docker was to assist in the development of Docker itself. Many people use it to run Jenkins CI. At first, this seems fine, but problems arise that can be avoided by installing Docker in the Jenkins CI container. This article explains how to do that. If you are interested in the final solution without details, just read the last section of the article titled 'Problem Solution.'<\/p>\n<p><img decoding=\"async\" alt=\"Think carefully before using Docker-in-Docker for CI or testing environments.\" src=\"\/wp-content\/uploads\/2020\/02\/0fdafa0c0a1768170cff52333e733314.png\" style=\"display:block;margin: 0 auto;\" \/><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Docker-in-Docker: 'Good'<\/h3>\n<p>\nMore than two years ago, I inserted into Docker <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/moby\/moby\/commit\/280901e5fbd0c2dabd14d7a9b69a073f6e8f87e4\">flag<\/a><\/noindex> \u2013privileged and wrote <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/commit\/bfbe19c0eec634f66c9f8bac53c6b7c7e0fdb063\">the first version of dind<\/a><\/noindex>. The goal was to assist the core team in developing Docker faster. Before Docker-in-Docker, the typical development cycle was like this:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>build;<\/li>\n<li>stop the running Docker daemon;<\/li>\n<li>start a new Docker daemon;<\/li>\n<li>test;<\/li>\n<li>loop again.<\/li>\n<\/ul>\n<p>\nIf you wanted to create a neat, reproducible build (that is, in a container), it became more complex:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>ensure that a working version of Docker was running;<\/li>\n<li>build new Docker with old Docker;<\/li>\n<li>stop the Docker daemon;<\/li>\n<li>start a new Docker daemon;<\/li>\n<li>test;<\/li>\n<li>stop the new Docker daemon;<\/li>\n<li>repeat.<\/li>\n<\/ul>\n<p>\nWith the advent of Docker-in-Docker, the process became simpler:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>build + run in one step;<\/li>\n<li>loop again.<\/li>\n<\/ul>\n<p>\nIsn't it much better this way?<\/p>\n<p><img decoding=\"async\" alt=\"Think carefully before using Docker-in-Docker for CI or testing environments.\" src=\"\/wp-content\/uploads\/2020\/02\/b4870536068c660a8d996ec53f079504.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Docker-in-Docker: 'Bad'<\/h3>\n<p>\nHowever, contrary to popular belief, Docker-in-Docker is not made up of 100% stars, ponies, and unicorns. I mean, there are several issues that developers need to be aware of.<\/p>\n<p>One of them concerns LSM (Linux Security Modules) like AppArmor and SELinux: when running a container, the 'inner Docker' may try to apply security profiles that may conflict or confuse the 'outer Docker.' This is the most complex issue that needed to be addressed when attempting to integrate the original implementation of the --privileged flag. My changes worked, and all tests would have passed on my Debian machine and the test virtual machines on Ubuntu, but they would collapse and burn on Michael Crosby's machine (as far as I remember, he had Fedora). I can't recall the exact reason for the problem, but it might have been because Mike is a wise man who works with SELINUX=enforce (I used AppArmor), and my changes did not take SELinux profiles into account.<\/p>\n<h3>Docker-in-Docker: 'Evil'<\/h3>\n<p>\nThe second issue is related to the storage drivers of Docker. When you run Docker-in-Docker, the outer Docker operates over the regular filesystem (EXT4, BTRFS, or whatever you have available), while the inner Docker runs over a copy-on-write filesystem (AUFS, BTRFS, Device Mapper, etc., depending on what the outer Docker is configured to use). This creates many combinations that won\u2019t work. For example, you cannot run AUFS on top of AUFS. <\/p>\n<p>If you run BTRFS on top of BTRFS, it should initially work, but once nested subvolumes appear, you won\u2019t be able to delete the parent subvolume. The Device Mapper module lacks namespaces, so if multiple Docker instances use it on the same machine, they will all be able to see (and influence) each other\u2019s images and the container\u2019s backup devices. This is bad.<\/p>\n<p>There are workarounds for many of these problems. For example, if you want to use AUFS in the inner Docker, just turn the folder \/var\/lib\/docker into that, and everything will be fine. Docker has added some basic namespaces to target Device Mapper names, so if multiple Docker calls are executed on one machine, they won\u2019t 'step' on each other.<\/p>\n<p>However, such a setup is not at all simple, as can be seen from these <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/issues\/78\">articles<\/a><\/noindex> in the dind repository on GitHub.<\/p>\n<h3>Docker-in-Docker: it gets even worse<\/h3>\n<p>\nWhat about the build cache? This can also be quite complicated. People often ask me, 'If I run Docker-in-Docker, how can I use images located on my host instead of pulling everything again in my inner Docker?'<\/p>\n<p>Some enterprising individuals have tried to bind \/var\/lib\/docker from the host to the Docker-in-Docker container. Sometimes they share \/var\/lib\/docker among multiple containers.<\/p>\n<p><img decoding=\"async\" alt=\"Think carefully before using Docker-in-Docker for CI or testing environments.\" src=\"\/wp-content\/uploads\/2020\/02\/192c9d26798d32078272aab1864bbccb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Want to corrupt your data? Because that's exactly what will damage your data!<\/i><\/p>\n<p>The Docker daemon was clearly designed to have exclusive access to \/var\/lib\/docker. Nothing else should 'touch, poke, or probe' any Docker files in this folder.<\/p>\n<p>Why is that? Because it's the result of one of the hardest lessons learned while developing dotCloud. The dotCloud container engine worked with multiple processes simultaneously accessing \/var\/lib\/dotcloud. Clever tricks, like atomic file replacements (instead of in-place edits), 'peppering' code with recommended and required locks, and other experiments with safe systems like SQLite and BDB, didn\u2019t always work. When we redesigned our container engine, which eventually became Docker, one of the main design decisions was to centralize all container operations under a single daemon to put an end to all this nonsense of concurrent access.<\/p>\n<p>Don\u2019t get me wrong: it is entirely possible to do something good, reliable, and fast that involves multiple processes and modern concurrent management. But we think it's simpler and easier to write and maintain code using Docker as a single player.<\/p>\n<p>This means that if you share the \/var\/lib\/docker directory between multiple Docker instances, you will run into issues. Of course, it might work, especially in the early stages of testing. 'Hey, Mom, I can run Ubuntu using Docker!' But try doing something more complex, like pulling the same image from two different instances, and you'll see the world burn.<\/p>\n<p>This means that if your CI system runs builds and rebuilds, every time you restart a Docker-in-Docker container, you risk dropping a nuclear bomb in its cache. That's not cool at all!<\/p>\n<h3>Troubleshooting<\/h3>\n<p>\nLet's take a step back. Do you really need Docker-in-Docker, or do you just want to be able to run Docker, namely build and run containers and images from your CI system, while that CI system itself is running in a container?<\/p>\n<p>I bet most people want the latter option, meaning they want a CI system like Jenkins to be able to run containers. And the easiest way to do this is to simply mount the Docker socket into your CI container using the -v flag.<\/p>\n<p>In simpler terms, when you run your CI container (Jenkins or another), instead of hacking something together with Docker-in-Docker, start it with the line:<\/p>\n<pre><code class=\"plaintext\">docker run -v \/var\/run\/docker.sock:\/var\/run\/docker.sock ...<\/code><\/pre>\n<p>\nNow this container will have access to the Docker socket and, therefore, will be able to run containers. Except that instead of launching 'child' containers, it will launch 'sibling' containers.<\/p>\n<p>Try this using the official Docker image (which contains the Docker binary):<\/p>\n<pre><code class=\"plaintext\">docker run -v \/var\/run\/docker.sock:\/var\/run\/docker.sock \n           -ti docker<\/code><\/pre>\n<p>\nThis looks and works like Docker-in-Docker, but it's not Docker-in-Docker: when this container creates additional containers, they will be created in the upper-level Docker. You won't experience the nesting side effects, and the build cache will be shared across multiple calls.<\/p>\n<p>Note: previous versions of this article recommended binding the Docker binary from the host to the container. This has now become unreliable, as the Docker mechanism no longer extends to static or nearly static libraries.<\/p>\n<p>Thus, if you want to use Docker from Jenkins CI, you have 2 options:<br \/>\ninstall the Docker CLI using the base image packaging system (i.e., if your image is based on Debian, use .deb packages), or use the Docker API.<\/p>\n<h3>A little advertisement \ud83d\ude42<\/h3>\n<p>\nThank you for staying with us. Do you enjoy our articles? Want to see more interesting content? Support us by placing an order or recommending us to your friends, <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">cloud VPS for developers starting at $4.99<\/a><\/noindex>, <b>a unique entry-level server alternative that we have created for you:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">The whole truth about VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps from $19 or how to properly share a server?<\/a><\/noindex> (options available with RAID1 and RAID10, up to 24 cores and up to 40GB DDR4).<\/p>\n<p><b>Dell R730xd at half the price in the Equinix Tier IV data center in Amsterdam?<\/b> Only with us <b><noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/serversnl\">2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100TB starting at $199<\/a><\/noindex> in the Netherlands! <b>Dell R420 \u2014 2x E5-2430 2.2GHz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 from $99!<\/b><\/b> Read about how <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">To build a corporate-class infrastructure using Dell R730xd E5-2650 v4 servers costing 9000 euros for peanuts?<\/a><\/noindex><br \/>\n<br \/>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ua-hosting\/blog\/488536\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>Docker-in-Docker \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 Docker-\u0434\u0435\u043c\u043e\u043d, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u0443\u044e \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0435\u043b\u044c\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Docker-in-Docker \u0431\u044b\u043b\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u0430\u043c\u043e\u0433\u043e Docker. \u041c\u043d\u043e\u0433\u0438\u0435 \u043b\u044e\u0434\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0435\u0433\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Jenkins CI. \u041f\u043e\u043d\u0430\u0447\u0430\u043b\u0443 \u044d\u0442\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u043c, \u043d\u043e \u0437\u0430\u0442\u0435\u043c \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0432 Docker \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 Jenkins CI. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043a\u0430\u043a \u044d\u0442\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":52072,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-52071","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\".\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/en\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0425\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0439\u0442\u0435, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Docker-in-Docker \u0434\u043b\u044f CI \u0438\u043b\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u044b | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\".\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-18T02:34:24+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T02:34:24+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Think carefully before using Docker-in-Docker for CI or testing environments | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/en\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0425\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0439\u0442\u0435, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Docker-in-Docker \u0434\u043b\u044f CI \u0438\u043b\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u044b | ProHoster","og:description":".","og:url":"https:\/\/prohoster.info\/en\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-18T02:34:24+00:00","article:modified_time":"2020-02-18T02:34:24+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52071","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:50:23","updated":"2022-09-27 17:46:30","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/52071","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=52071"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/52071\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/52072"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=52071"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=52071"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=52071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}