{"id":474225,"date":"2022-07-15T09:02:59","date_gmt":"2022-07-15T06:02:59","guid":{"rendered":"https:\/\/en.buradabiliyorum.com\/how-to-accelerate-docker-builds-and-optimize-caching-with-copy-link\/"},"modified":"2022-07-15T09:02:59","modified_gmt":"2022-07-15T06:02:59","slug":"how-to-accelerate-docker-builds-and-optimize-caching-with-copy-link","status":"publish","type":"post","link":"https:\/\/buradabiliyorum.com\/en\/how-to-accelerate-docker-builds-and-optimize-caching-with-copy-link\/","title":{"rendered":"#How to Accelerate Docker Builds and Optimize Caching With \u201cCOPY \u2013link\u201d"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-6a2a42b8e3c4b\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #dd3333;color:#dd3333\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #dd3333;color:#dd3333\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6a2a42b8e3c4b\" checked aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-accelerate-docker-builds-and-optimize-caching-with-copy-link\/#%E2%80%9CHow_to_Accelerate_Docker_Builds_and_Optimize_Caching_With_%E2%80%9CCOPY_%E2%80%93link%E2%80%9D%E2%80%9D\" >&#8220;How to Accelerate Docker Builds and Optimize Caching With \u201cCOPY \u2013link\u201d&#8221;<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-accelerate-docker-builds-and-optimize-caching-with-copy-link\/#What_Is_%E2%80%9C%E2%80%93link%E2%80%9D\" >What Is \u201c\u2013link\u201d?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-accelerate-docker-builds-and-optimize-caching-with-copy-link\/#Introducing_%E2%80%9C%E2%80%93link%E2%80%9D\" >Introducing \u201c\u2013link\u201d<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-accelerate-docker-builds-and-optimize-caching-with-copy-link\/#Adding_%E2%80%9CCOPY_%E2%80%93link%E2%80%9D_to_Your_Builds\" >Adding \u201cCOPY \u2013link\u201d to Your Builds<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-accelerate-docker-builds-and-optimize-caching-with-copy-link\/#Why_Linked_Copies_Matter\" >Why Linked Copies Matter<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-accelerate-docker-builds-and-optimize-caching-with-copy-link\/#When_Not_To_Use_It\" >When Not To Use It<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-accelerate-docker-builds-and-optimize-caching-with-copy-link\/#Summary\" >Summary<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h1><span class=\"ez-toc-section\" id=\"%E2%80%9CHow_to_Accelerate_Docker_Builds_and_Optimize_Caching_With_%E2%80%9CCOPY_%E2%80%93link%E2%80%9D%E2%80%9D\"><\/span>&#8220;How to Accelerate Docker Builds and Optimize Caching With \u201cCOPY \u2013link\u201d&#8221;<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<div>\n<img loading=\"lazy\" decoding=\"async\" class=\"type:primaryImage aligncenter size-full wp-image-14169\" data-pagespeed-no-defer=\"\" src=\"https:\/\/www.howtogeek.com\/wp-content\/uploads\/csit\/2021\/09\/993634a1.png?width=1198&amp;trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"\" width=\"1200\" height=\"675\"\/><\/p>\n<p><code>COPY --link<\/code> is a new <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/docker\/buildx\/tree\/v0.8.0\">BuildKit<\/a> feature which could substantially accelerate your Docker image builds. It works by copying files into independent image layers that don\u2019t rely on the presence of their predecessors. You can add new content to images without the base image even existing on your system.<\/p>\n<p>This capability was added as part of <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/docker\/buildx\/tree\/v0.8.0\">Buildx v0.8<\/a> in March 2022. It\u2019s <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/docs.docker.com\/engine\/release-notes\/#201014\">included in version 20.10.14<\/a> of the Docker CLI so you should already have access if you\u2019re running the latest release.<\/p>\n<p>In this article, we\u2019ll show what <code>--link<\/code> does and explain how it works. We\u2019ll also look at some of the situations in which it <em>shouldn\u2019t<\/em> be used.<\/p>\n<h2 id=\"what-is-link\"><span class=\"ez-toc-section\" id=\"What_Is_%E2%80%9C%E2%80%93link%E2%80%9D\"><\/span>What Is \u201c\u2013link\u201d?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><code>--link<\/code> is a new optional argument for the existing Dockerfile <code>COPY<\/code> instruction. It changes the way copies work by creating a new snapshot layer each time you use it.<\/p>\n<p>Regular <code>COPY<\/code> statements add files to the layer that precedes them in the Dockerfile. The contents of that layer need to exist on your disk so the new content can be merged in:<\/p>\n<pre>FROM alpine&#13;\nCOPY my-file \/my-file&#13;\nCOPY another-file \/another-file<\/pre>\n<p>The Dockerfile above copies <code>my-file<\/code> into the layer produced by the previous command. After the <code>FROM<\/code> instruction, the image consists of Alpine\u2019s content:<\/p>\n<pre>bin\/&#13;\ndev\/&#13;\netc\/&#13;\n...<\/pre>\n<p>The first <code>COPY<\/code> instruction produces an image that includes everything from Alpine, as well as the <code>my-file<\/code> file:<\/p>\n<pre>my-file&#13;\nbin\/&#13;\ndev\/&#13;\netc\/&#13;\n...<\/pre>\n<p>And the second <code>COPY<\/code> instruction adds <code>another-file<\/code> on top of this image:<\/p>\n<pre>another-file&#13;\nmy-file&#13;\nbin\/&#13;\ndev\/&#13;\netc\/&#13;\n...<\/pre>\n<p>The layer produced by each instruction includes everything that came before it, as well as anything newly added. At the end of the build, Docker uses a diffing process to work out the changes within each layer. The final image blob contains just the files that were added in each snapshot stage but this isn\u2019t reflected in the assembly process during the build.<\/p>\n<h2 id=\"introducing-link\"><span class=\"ez-toc-section\" id=\"Introducing_%E2%80%9C%E2%80%93link%E2%80%9D\"><\/span>Introducing \u201c\u2013link\u201d<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u201c\u2013link\u201d modifies <code>COPY<\/code> to create a new standalone filesystem each time it\u2019s used. Instead of copying the new files on top of the previous layer, they\u2019re sent to a completely different location to become an independent layer. Layers are subsequently linked together to produce the final image.<\/p>\n<p>Let\u2019s change the example Dockerfile to use <code>--link<\/code>:<\/p>\n<pre>FROM alpine&#13;\nCOPY --link my-file \/my-file&#13;\nCOPY --link another-file \/another-file<\/pre>\n<p>The result of the <code>FROM<\/code> instruction is unchanged \u2013 it yields the Alpine layer, with all that image\u2019s content:<\/p>\n<pre>bin\/&#13;\ndev\/&#13;\netc\/&#13;\n...<\/pre>\n<p>The first <code>COPY<\/code> instruction has a noticeably different effect. This time another independent layer is created. It\u2019s a new filesystem containing only <code>my-file<\/code>:<\/p>\n<pre>my-file<\/pre>\n<p>Then the second <code>COPY<\/code> instruction creates another new snapshot with only <code>another-file<\/code>:<\/p>\n<pre>another-file<\/pre>\n<p>When the build completes, Docker stores these independent snapshots as new layer archives (tarballs). The tarballs are linked back into the chain of preceding layers, building up the final image. This consists of all three snapshots merged together, resulting in a filesystem that matches the original one when containers are created:<\/p>\n<pre>my-file&#13;\nanother-file&#13;\nbin\/&#13;\ndev\/&#13;\netc\/&#13;\n...<\/pre>\n<p>This image from the BuildKit project illustrates the differences between the two <a href=\"https:\/\/buradabiliyorum.com\/en\/category\/download-scripts-themes-apps\/\" data-internallinksmanager029f6b8e52c=\"9\" title=\"Download Scripts &amp; Themes &amp; Apps\" target=\"_blank\" rel=\"noopener\">app<\/a>roaches.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16036\" data-pagespeed-lazy-src=\"https:\/\/www.howtogeek.com\/wp-content\/uploads\/csit\/2022\/03\/9baaf277.png?trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"Image from Docker blog showing the differences between &quot;COPY&quot; and &quot;COPY --link&quot;\" width=\"1110\" height=\"584\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><\/p>\n<h2 id=\"adding-copy-link-to-your-builds\"><span class=\"ez-toc-section\" id=\"Adding_%E2%80%9CCOPY_%E2%80%93link%E2%80%9D_to_Your_Builds\"><\/span>Adding \u201cCOPY \u2013link\u201d to Your Builds<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><code>COPY --link<\/code> is only available when you\u2019re using BuildKit to build your images. Either run your build with <code>docker buildx --create<\/code> or use <code>docker build<\/code> with the <code>DOCKER_BUILDKIT=1<\/code> environment variable set.<\/p>\n<p>You must also opt-in to the Dockerfile v1.4 syntax using a comment at the top of your file:<\/p>\n<pre># syntax=docker\/dockerfile:1.4&#13;\nFROM alpine:latest&#13;\nCOPY --link my-file \/my-file&#13;\nCOPY --link another-file \/another-file<\/pre>\n<p>Now you can build your image with support for linked copies:<\/p>\n<pre>DOCKER_BUILDKIT=1 docker build -t my-image:latest .<\/pre>\n<p>Images built from Dockerfiles using <code>COPY --link<\/code> can be used like any other. You can start a container with <code>docker run<\/code> and push them straight to registries. The <code>--link<\/code> flag only affects how content is added to the image layers during the build.<\/p>\n<h2 id=\"why-linked-copies-matter\"><span class=\"ez-toc-section\" id=\"Why_Linked_Copies_Matter\"><\/span>Why Linked Copies Matter<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Using the <code>--link<\/code> flag allow build caches to be reused even when content you <code>COPY<\/code> in changes. In addition, builds may be able to complete without their base image even existing on your machine.<\/p>\n<p>Returning to the example from above, standard <code>COPY<\/code> behavior requires the <code>alpine<\/code> image to exist on your Docker host before the new content can be added. The image will be downloaded automatically during the build if you\u2019ve not previously pulled it.<\/p>\n<p>With linked copies, Docker doesn\u2019t need the <code>alpine<\/code> image\u2019s content. It pulls the <code>alpine<\/code> manifest, creates new independent layers for the copied files, then creates a revised manifest that links the layers into those provided by <code>alpine<\/code>. The content of the <code>alpine<\/code> image \u2013 its layer blobs \u2013 will only be downloaded if you start a container from your new image or export it to a tar archive. When you push the image to a registry, that registry will store its new layers and remotely acquire the <code>alpine<\/code> ones.<\/p>\n<p>This functionality facilitates efficient image rebases too. Perhaps you\u2019re currently distributing a Docker image using the latest Ubuntu 20.04 LTS release:<\/p>\n<pre>FROM golang AS build&#13;\n...&#13;\nRUN go build -o \/app .&#13;\n&#13;\nFROM ubuntu:20.04&#13;\nCOPY --link --from=build \/app \/bin\/app&#13;\nENTRYPOINT [\"\/bin\/app\"]<\/pre>\n<p>You can build the image with caching enabled using BuildKit\u2019s <code>--cache-to<\/code> flag. The <code>inline<\/code> cache stores build cache data inside the output image, where it can be reused in subsequent builds:<\/p>\n<pre>docker buildx build --cache-to type=inline -t example-image:20.04 .<\/pre>\n<p>Now let\u2019s say you\u2019d like to provide an image that\u2019s based on the next LTS after its release, Ubuntu 22.04:<\/p>\n<pre>FROM golang AS build&#13;\n...&#13;\nRUN go build -o \/app .&#13;\n&#13;\nFROM ubuntu:22.04&#13;\nCOPY --link --from=build \/app \/bin\/app&#13;\nENTRYPOINT [\"\/bin\/app\"]<\/pre>\n<p>Rebuild the image using the cache data embedded in the original version:<\/p>\n<pre>docker buildx build --cache-from example-image:20.04 -t example-image:22.04 .<\/pre>\n<p>The build will complete almost instantly. Using the cached data from the existing image, Docker can verify the files needed to build <code>\/app<\/code> haven\u2019t changed. This means the cache for the independent layer created by the <code>COPY<\/code> instruction remains valid. As this layer doesn\u2019t depend on any other, the <code>ubuntu:22.04<\/code> image won\u2019t be pulled either. Docker merely links the snapshot layer containing <code>\/bin\/app<\/code> into a new manifest within the <code>ubuntu:22.04<\/code> layer chain. The snapshot layer is effectively \u201crebased\u201d onto a new parent image, without any filesystem operations occurring.<\/p>\n<p>The model also optimizes multi-stage builds where changes can occur between any of the stages:<\/p>\n<pre>FROM golang AS build&#13;\nRUN go build -o \/app .&#13;\n&#13;\nFROM config-builder AS config&#13;\nRUN generate-config --out \/config.yaml&#13;\n&#13;\nFROM ubuntu:latest&#13;\nCOPY --link --from=config \/config.yaml build.conf&#13;\nCOPY --link --from=build \/app \/bin\/app<\/pre>\n<p>Without <code>--link<\/code>, any change to the generated <code>config.yaml<\/code> causes <code>ubuntu:latest<\/code> to be pulled and the file to be copied in. The binary then has to be recompiled as its cache is invalidated by the filesystem changes. With linked copies, a change to <code>config.yaml<\/code> allows the build to continue without pulling <code>ubuntu:latest<\/code> or recompiling the binary. The snapshot layer with <code>build.conf<\/code> inside is simply replaced by a new version that\u2019s independent of all the other layers.<\/p>\n<h2 id=\"when-not-to-use-it\"><span class=\"ez-toc-section\" id=\"When_Not_To_Use_It\"><\/span>When Not To Use It<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>There are some situations where the <code>--link<\/code> flag won\u2019t work correctly. Because it copies files into a new layer, instead of adding them on top of the previous one, you can\u2019t use ambiguous references as your destination path:<\/p>\n<pre>COPY --link my-file \/data<\/pre>\n<p>With a regular <code>COPY<\/code> instruction, <code>my-file<\/code> will be copied to <code>\/data\/my-file<\/code> if <code>\/data<\/code> already exists as a directory in the image. With <code>--link<\/code>, the target layer\u2019s filesystem will always be empty, so <code>my-file<\/code> gets written to <code>\/data<\/code>.<\/p>\n<p>The same consideration applies to symlink resolution. Standard <code>COPY<\/code> automatically resolves destination paths that are symlinks in the image. When you\u2019re using <code>--link<\/code>, this behavior isn\u2019t supported as the symlink won\u2019t exist in the copy\u2019s independent layer.<\/p>\n<p>It\u2019s recommended you start using <code>--link<\/code> wherever these limitations don\u2019t apply. Adopting this feature will speed up your builds and make caching more powerful. If you can\u2019t im<a href=\"https:\/\/buradabiliyorum.com\/en\/category\/social-mediaa\/\" data-internallinksmanager029f6b8e52c=\"1\" title=\"Social Media\" target=\"_blank\" rel=\"noopener\">media<\/a>tely remove ambiguous or symlinked destination paths, you can keep using the existing <code>COPY<\/code> instruction. It\u2019s due to these backwards incompatible changes that <code>--link<\/code> is an optional flag, instead of the new default.<\/p>\n<h2 id=\"summary\"><span class=\"ez-toc-section\" id=\"Summary\"><\/span>Summary<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>BuildKit\u2019s <code>COPY --link<\/code> is a new Dockerfile feature which can make builds quicker and more efficient. Images using linked copies don\u2019t need to pull previous layers just so files can be copied into them. Docker creates a new independent layer for each <code>COPY<\/code> instead, then links those layers back into the chain.<\/p>\n<p>You can start using linked copies now if you\u2019re building images with BuildKit and the latest version of the Buildx or Docker CLI. Adopting \u201c\u2013link\u201d is a new best practice Docker build step, provided you\u2019re not affected by the changes to destination path resolution that it necessitates.<\/p>\n<\/div>\n<p><script>\n setTimeout(function(){\n  !function(f,b,e,v,n,t,s)\n  {if(f.fbq)return;n=f.fbq=function(){n.callMethod?\n  n.callMethod.apply(n,arguments):n.queue.push(arguments)};\n  if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';\n  n.queue=[];t=b.createElement(e);t.async=!0;\n  t.src=v;s=b.getElementsByTagName(e)[0];\n  s.parentNode.insertBefore(t,s) } (window, document,'script',\n  'https:\/\/connect.facebook.net\/en_US\/fbevents.js');\n   fbq('init', '335401813750447');\n   fbq('track', 'PageView');\n  },3000);\n<\/script><\/p>\n<blockquote><p><strong><span style=\"color: #ff6600;\">If you liked the article, do not forget to share it with your friends. Follow us on\u00a0<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/news.google.com\/publications\/CAAqBwgKMLG0nwswvr63Aw\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Google News<\/a><\/span>\u00a0too, click on the star and choose us from your favorites.<\/span><\/strong><\/p><\/blockquote>\n<blockquote>\n<p style=\"text-align: center;\">For forums sites go to <span style=\"color: #ff9900;\"><a style=\"color: #ff9900;\" href=\"https:\/\/forum.buradabiliyorum.com\/\" target=\"_blank\" rel=\"noopener\">Forum.BuradaBiliyorum.Com<\/a><\/span><\/strong><\/p>\n<\/blockquote>\n<blockquote>\n<p style=\"text-align: center;\"><strong>If you want to read more like this article, you can visit our <span style=\"color: #ff9900;\"><a style=\"color: #ff9900;\" href=\"https:\/\/en.buradabiliyorum.com\/technology\/\" target=\"_blank\" rel=\"noopener\">Technology category.<\/a><\/span><\/strong><\/p>\n<\/blockquote>\n<p><span style=\"color: black;\"><a style=\"color: #ff9900;\" href=\"https:\/\/www.howtogeek.com\/devops\/how-to-accelerate-docker-builds-and-optimize-caching-with-copy-link\/\" target=\"_blank\" rel=\"noopener\">Source<\/a><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8220;How to Accelerate Docker Builds and Optimize Caching With \u201cCOPY \u2013link\u201d&#8221; COPY &#8211;link is a new BuildKit feature which could substantially accelerate your Docker image builds. It works by copying files into independent image layers that don\u2019t rely on the presence of their predecessors. You can add new content to images without the base image&#8230;<\/p>\n","protected":false},"author":1,"featured_media":474226,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/www.howtogeek.com\/wp-content\/uploads\/csit\/2021\/09\/993634a1.png?height=200p&trim=2,2,2,2","fifu_image_alt":"","footnotes":""},"categories":[18],"tags":[],"class_list":["post-474225","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology"],"_links":{"self":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts\/474225","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/comments?post=474225"}],"version-history":[{"count":0,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts\/474225\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/media\/474226"}],"wp:attachment":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/media?parent=474225"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/categories?post=474225"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/tags?post=474225"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}