{"id":882,"date":"2024-10-08T07:56:00","date_gmt":"2024-10-08T07:56:00","guid":{"rendered":"https:\/\/blog.ngocha.biz\/?p=882"},"modified":"2024-10-08T07:56:00","modified_gmt":"2024-10-08T07:56:00","slug":"scan-docker-images-using-trivy","status":"publish","type":"post","link":"https:\/\/blog.ngocha.biz\/?p=882","title":{"rendered":"Using Trivy Container Scanner to Detect Vulnerabilities (Comprehensive Guide)"},"content":{"rendered":"<p>This blog covers the essential steps to secure your Docker images against potential vulnerabilities using Trivy Container Scanner.<\/p>\n<h2 id=\"what-is-trivy\">What is Trivy?<\/h2>\n<p><a href=\"https:\/\/trivy.dev\/?ref=devopscube.com\" rel=\"noreferrer noopener\">Trivy<\/a> is an <strong>open-source security scanner<\/strong> that scans for vulnerabilities in containers and other artifacts. It has an internal database called <a href=\"https:\/\/github.com\/aquasecurity\/trivy-db?ref=devopscube.com\" rel=\"noreferrer noopener\">trivy-db<\/a><strong> <\/strong>which contains information about different vulnerabilities.<\/p>\n<p>It is created and maintained by <a href=\"https:\/\/www.aquasec.com\/?ref=devopscube.com\" rel=\"noreferrer noopener\">AquaSecurity<\/a><\/p>\n<p>Trivy not only scan for vulnerability but also give suggestion to solve the issues and links to the vulnerable data for more information.<\/p>\n<p>Trivy can access a wide range of vulnerability information from different vulnerability databases and uses vulnerability data from those vulnerability databases to detect security issues. Some of the vulnerability databases are <a href=\"https:\/\/nvd.nist.gov\/?ref=devopscube.com\">National Vulnerability Database (NVD)<\/a>, Red Hat Security Data, and Alpine SecDB.<\/p>\n<p>While scanning Trivy compares the directory or container image&#8217;s software packages and libraries with the information in the vulnerability database and if a match is found that means the package or library in the container image has a vulnerability. Then Trivy reports these vulnerabilities along with other details such as severity level, affected versions, and repair suggestions.<\/p>\n<p>Trivy updates its database every 6 hours. When you start the scan, trivy updates the databases automatically so that you don&#8217;t have to keep track of database updates.<\/p>\n<p>Another important feature of Trivy is generating SBOM. It provides a detailed inventory of all the components used in software, including open-source and third-party libraries.<\/p>\n<h2 id=\"install-trivy\">Install Trivy<\/h2>\n<p>Let&#8217;s see how to install Trivy on Ubuntu, follow the below steps to install Trivy.<\/p>\n<p>For other platform, please visit the <a href=\"https:\/\/aquasecurity.github.io\/trivy\/v0.18.3\/installation\/?ref=devopscube.com\" rel=\"noreferrer noopener\">official installation page.<\/a><\/p>\n<p><strong>Step 1: <\/strong>First, install the required dependencies for Trivy using the command given below:<\/p>\n<pre><code>sudo apt-get install wget apt-transport-https gnupg lsb-release<\/code><\/pre>\n<p><strong>Step 2:<\/strong> Download the public key and Trivy repository using the commands given below:<\/p>\n<pre><code>wget -qO - https:\/\/aquasecurity.github.io\/trivy-repo\/deb\/public.key | gpg --dearmor | sudo tee \/usr\/share\/keyrings\/trivy.gpg &gt; \/dev\/null\n\necho \"deb [signed-by=\/usr\/share\/keyrings\/trivy.gpg] https:\/\/aquasecurity.github.io\/trivy-repo\/deb $(lsb_release -sc) main\" | sudo tee -a \/etc\/apt\/sources.list.d\/trivy.list<\/code><\/pre>\n<p><strong>Step 3:<\/strong> Update the repository using the update command.<\/p>\n<pre><code>sudo apt update -y<\/code><\/pre>\n<p><strong>Step 4:<\/strong> Install Trivy using the command:<\/p>\n<pre><code>sudo apt install trivy<\/code><\/pre>\n<p>To verify the installation and understand all the available option, run the following trivy help command.<\/p>\n<pre><code>trivy -h<\/code><\/pre>\n<p>You should get an output a shown below.<\/p>\n<pre><code>trivy -h\nScanner for vulnerabilities in container images, file systems, and Git repositories, as well as for configuration issues and hard-coded secrets\n\nUsage:\n  trivy [global flags] command [flags] target\n  trivy [command]\n\nExamples:\n  # Scan a container image\n  $ trivy image python:3.4-alpine\n\n  # Scan a container image from a tar archive\n  $ trivy image --input ruby-3.1.tar\n\n  # Scan local filesystem\n  $ trivy fs .\n\n  # Run in server mode\n  $ trivy server\n\nScanning Commands\n  aws         [EXPERIMENTAL] Scan AWS account\n  config      Scan config files for misconfigurations\n  filesystem  Scan local filesystem\n  image       Scan a container image\n  kubernetes  [EXPERIMENTAL] Scan kubernetes cluster\n  repository  Scan a remote repository\n  rootfs      Scan rootfs\n  sbom        Scan SBOM for vulnerabilities\n  vm          [EXPERIMENTAL] Scan a virtual machine image\n\nManagement Commands\n  module      Manage modules\n  plugin      Manage plugins\n\nUtility Commands\n  completion  Generate the autocompletion script for the specified shell\n  convert     Convert Trivy JSON report into a different format\n  help        Help about any command\n  server      Server mode\n  version     Print the version\n\nFlags:\n      --cache-dir string          cache directory (default \"\/Users\/bibinwilson\/Library\/Caches\/trivy\")\n  -c, --config string             config path (default \"trivy.yaml\")\n  -d, --debug                     debug mode\n  -f, --format string             version format (json)\n      --generate-default-config   write the default config to trivy-default.yaml\n  -h, --help                      help for trivy\n      --insecure                  allow insecure server connections\n  -q, --quiet                     suppress progress bar and log output\n      --timeout duration          timeout (default 5m0s)\n  -v, --version                   show version\n\nUse \"trivy [command] --help\" for more information about a command.\n<\/code><\/pre>\n<h2 id=\"using-trivy-to-scan-for-vulnerability\">Using Trivy To Scan for Vulnerability<\/h2>\n<p>Whenever you run the Trivy command to scan for vulnerabilities it will download the relevant database first and compare it with the vulnerabilities listed in the database.<\/p>\n<p>Trivy shows the risk of vulnerability as critical, high, medium, and low.<\/p>\n<ol>\n<li><strong>Critical<\/strong> &#8211; This is the most severe vulnerability which needs to be fixed as soon as possible because it can allow administrative control over the system.<\/li>\n<li><strong>High<\/strong> &#8211; It could cause data leakage.<\/li>\n<li><strong>Medium<\/strong> &#8211; It could make the system unavailable for users.<\/li>\n<li><strong>Low<\/strong> &#8211; This can be solved during regular maintenance.<\/li>\n<\/ol>\n<p>We can use Trivy to scan the following targets:<\/p>\n<ol>\n<li>Container images<\/li>\n<li>Filesystem<\/li>\n<li>Remote Git repositories<\/li>\n<\/ol>\n<p>There are also experimental features to scan <a href=\"https:\/\/devopscube.com\/kubernetes-tutorials-beginners\/\">Kubernetes<\/a> &amp; AWS configurations.<\/p>\n<p>Trivy uses different commands to scan targets that are mentioned above.<\/p>\n<p>The following image shows the high level components and container scanning workflow.<\/p>\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/trivy-blog-image-1.gif\" class=\"kg-image\" alt=\"Trivy Docker Image Scan Workflow\" loading=\"lazy\" width=\"772\" height=\"538\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2025\/03\/trivy-blog-image-1.gif 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/trivy-blog-image-1.gif 772w\" sizes=\"auto, (min-width: 720px) 720px\"><figcaption><span style=\"white-space: pre-wrap;\">Click to View in HD<\/span><\/figcaption><\/figure>\n<h2 id=\"scan-container-images-with-trivy\">Scan Container Images With Trivy<\/h2>\n<p>To get started, you need to have trivy intalled on you system or the <strong>CI agent node<\/strong> where you want to implement the Docker image scanning.<\/p>\n<p>You can find the installation steps at official <a href=\"https:\/\/aquasecurity.github.io\/trivy\/v0.18.3\/installation\/?ref=devopscube.com\" rel=\"noreferrer noopener\">Trivy installation page.<\/a><\/p>\n<p>Scanning Docker Images using Trivy is very easy. You just need to run the following trivy command with the image name you want to scan.<\/p>\n<pre><code>trivy image &lt;image-name&gt;<\/code><\/pre>\n<p>For example, I have a image named <strong><code>techiescamp\/pet-clinic-app<\/code><\/strong> in my workstation. It is a <a href=\"https:\/\/devopscube.com\/dockerize-java-application\/\">docker image with java spring boot<\/a> application.<\/p>\n<p>I can scan the image using the following command. Trivy scans for both vulnerabilities in the image as as the java jar that is part of the image. The results of the scan will be displayed in a human-readable format.<\/p>\n<pre><code>trivy image techiescamp\/pet-clinic-app:1.0.0<\/code><\/pre>\n<p>The scan result shows that there are not high or critical vulnerabilties in the image.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-26-11.png\" class=\"kg-image\" alt=\"Trivy Docker image scan result\" loading=\"lazy\" width=\"721\" height=\"458\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2025\/03\/image-26-11.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-26-11.png 721w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>Also it shows<strong> 2 high vulnerabilities<\/strong> for the jar inside the Docker image.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-27-11.png\" class=\"kg-image\" alt=\"Trivy Docker image jar scan result.\" loading=\"lazy\" width=\"677\" height=\"395\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2025\/03\/image-27-11.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-27-11.png 677w\"><\/figure>\n<p>Trivy can be used in multiple ways. Here are a few examples of advanced usage:<\/p>\n<h3 id=\"scan-for-severity\"><strong>Scan for severity<\/strong><\/h3>\n<p>Trivy can scan for vulnerabilities of a specific severity. To do this, use the <code>--severity &lt;severity&gt;<\/code> flag to specify the vulnerability severity that you need to scan.<\/p>\n<pre><code>trivy image --severity CRITICAL techiescamp\/pet-clinic-app:1.0.0<\/code><\/pre>\n<h3 id=\"output-as-json\"><strong>Output as JSON<\/strong><\/h3>\n<p>Trivy can also give output in JSON format. To do this, use the <code>--format json<\/code> flag, it will display the scanned results in JSON format.<\/p>\n<pre><code>trivy image --format json techiescamp\/pet-clinic-app:1.0.0<\/code><\/pre>\n<h3 id=\"ignore-fixed-vulnerabilities\"><strong>Ignore fixed vulnerabilities<\/strong><\/h3>\n<p>There are vulnerabilities that cannot be fixed even if the packages are updated (unpatched\/unfixed). Trivy can scan images ignoring those vulnerabilities. To do this, use the <code>--ignore-unfixed<\/code> flag.<\/p>\n<pre><code>trivy image --ignore-unfixed java:0.1<\/code><\/pre>\n<h3 id=\"scan-docker-tar-images\">Scan Docker tar Images<\/h3>\n<p>There are situations you might have the Docker images in tar format. In this case, you can use trivy to scan the image in tar format.<\/p>\n<p>For example,<\/p>\n<pre><code>trivy image --input petclinic-app.tar<\/code><\/pre>\n<h2 id=\"trivy-scan-in-docker-image-build-pipeline\">Trivy Scan in Docker Image Build Pipeline<\/h2>\n<p>Trivy plays a key role in CI\/CD pipeline in terms <a href=\"https:\/\/devopscube.com\/build-docker-image\/\">docker image builds<\/a>. Organizations use trivy to scan for vulnerabilities in CI\/CD pipeline to ensure a seecure image is getting deployed in production.<\/p>\n<p>When using in CI\/CD piepline, the the <strong>pipeline job should fail<\/strong> if there is any vulnerability in the image. The severity depends on the organizations security compliance. For example, some organization may have strict guidelines to fail the build for both HIGH and CRITICAL severities.<\/p>\n<p>Now, the best way to fail the build is using exit codes.<\/p>\n<p>To do this, use the  <code>--severity<\/code> and <code>--exit-code 1<\/code> flag with the trivy command as shown below. It will make Trivy exit with a non-zero exit code if any vulnerabilities are found for the given severities<\/p>\n<pre><code>trivy image --severity HIGH,CRITICAL  --exit-code 1 techiescamp\/pet-clinic-app:1.0.0<\/code><\/pre>\n<p>Also, you can send the vulnerability report as a build failure notification to developers and DevOps engineers.<\/p>\n<p>A recommended approach is to use a Trivy config file to set the defaults for a scan. You can use this file to accomodate your scanning requirements specific to your project needs.<\/p>\n<p>Here is an example of <code>trivy.yaml <\/code>file<\/p>\n<pre><code>timeout: 10m\nformat: json\ndependency-tree: true\nlist-all-pkgs: true\nexit-code: 1\noutput: result.json\nseverity:\n  - HIGH\n  - CRITICAL\nscan:\n  skip-dirs:\n    - \/lib64\n    - \/lib\n    - \/usr\/lib\n    - \/usr\/include\n\n  security-checks:\n    - vuln\n    - secret\nvulnerability:\n  type:\n    - os\n    - library\n  ignore-unfixed: true\ndb:\n  skip-update: false<\/code><\/pre>\n<p>Here is the syntax to use the config file<\/p>\n<pre><code>trivy image --config path\/to\/trivy.yaml your-image-name:tag<\/code><\/pre>\n<h2 id=\"generate-a-software-bill-of-materials-sbom\">Generate a Software Bill of Materials (SBOM)<\/h2>\n<p>An SBOM is a <strong>complete list of all components<\/strong> used in a software application, such as a library, framework, and module, including their versions.<\/p>\n<p>It helps to identify potential vulnerabilities, manage licenses, and maintain software more effectively.<\/p>\n<p>For example, vulnerabilities like Log4j (CVE-2021-44228) affected many organization. With SBOM organizations can quickly search across its entire software ecosystem to locate <strong>which applications or services use Log4j<\/strong> and take remediation measures.<\/p>\n<p>Trivy can generate SBOM <a href=\"https:\/\/cyclonedx.org\/?ref=devopscube.com\">CycloneDX<\/a> and <a href=\"https:\/\/spdx.dev\/?ref=devopscube.com\">SPDX<\/a> formats.<\/p>\n<p>Use the below command to generate SBOM in either CycloneDX or SPDX format.<\/p>\n<pre><code>trivy image --format spdx-json --output result.json techiescamp\/pet-clinic-app:1.0.0\n\ntrivy image --format cyclonedx --output result.json techiescamp\/pet-clinic-app:1.0.0<\/code><\/pre>\n<p>Trivy also has the ability to scan for vulnerabilities using the SBOM file, use the following command to scan for vulnerabilities using an SBOM file<\/p>\n<pre><code>trivy sbom result.json<\/code><\/pre>\n<p>Scan Filesystem<\/p>\n<p>The command used to scan the filesystem is given below:<\/p>\n<pre><code>trivy fs &lt;path of the directory&gt;<\/code><\/pre>\n<p>For example, if the path of the directory is Documents\/jenkins-pipeline\/ then the command will be:<\/p>\n<pre><code>trivy fs Documents\/jenkins-pipeline\/<\/code><\/pre>\n<p>It will scan the directory and shows the vulnerability in the directory as shown below.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/b1-2.png\" class=\"kg-image\" alt=\"Trivy Filesystem Scan\" loading=\"lazy\" width=\"676\" height=\"542\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2025\/03\/b1-2.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/b1-2.png 676w\"><\/figure>\n<h2 id=\"scan-git-repository\">Scan Git Repository<\/h2>\n<p>The command used to scan the git repository is given below:<\/p>\n<pre><code>trivy repo &lt;repo URL&gt;<\/code><\/pre>\n<p>If you are using a private repository, you need to provide your git token for authentication as given below.<\/p>\n<pre><code>export GITHUB_TOKEN=,git token&gt;\n\ntrivy repo &lt;repo URL&gt;<\/code><\/pre>\n<p>It will scan the repo and shows the vulnerability in the repo as shown below.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/c1-2.png\" class=\"kg-image\" alt=\"Trivy remote fit repo scan\" loading=\"lazy\" width=\"1440\" height=\"950\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2025\/03\/c1-2.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1000\/2025\/03\/c1-2.png 1000w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/c1-2.png 1440w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>You can also check out the official Trivy scanner video guide to see Trivy in action.<\/p>\n<figure class=\"kg-card kg-embed-card\"><iframe loading=\"lazy\" width=\"160\" height=\"90\" src=\"https:\/\/www.youtube.com\/embed\/-IH5inFyEqU?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen=\"\"><\/iframe><\/figure>\n<h2 id=\"what-does-trivy-scan-in-container-images\">What Does Trivy Scan In Container Images?<\/h2>\n<p>Following are the key elements in the Docker image that are scanned by Trivy.<\/p>\n<ol>\n<li><strong>Trivy can scan for vulnerabilities in a variety of package managers, including apt, yum, apk, and npm.<\/strong> This means that Trivy can scan for vulnerabilities in images that use a variety of different software dependencies.<\/li>\n<li><strong>Trivy can scan for vulnerabilities in both Linux and Windows images.<\/strong> This means that you can use Trivy to scan images that will be running on either Linux or Windows hosts.<\/li>\n<li><strong>Trivy can scan for vulnerabilities in images that are stored in a variety of different formats, including Docker images, tar archives, and filesystems.<\/strong> This means that you can use Trivy to scan images that are stored in a variety of different locations.<\/li>\n<li><strong>Trivy can scan for vulnerabilities in Docker images running in various environments, including plain Docker containers and <\/strong><a href=\"https:\/\/devopscube.com\/kubernetes-pod\/\"><strong>Kubernetes pods<\/strong><\/a><strong>.<\/strong> This means that you can use Trivy to scan images that are running in any environment that you use.<\/li>\n<\/ol>\n<h2 id=\"benefits-of-container-image-vulnerability-scanning-with-trivy\">Benefits of Container Image Vulnerability Scanning With Trivy<\/h2>\n<p>The following graphs shows the total vulnerabilities from the CVE database. As you can see it keeps on increasing every year.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-25-13.png\" class=\"kg-image\" alt=\"CVE vulnerability graph\" loading=\"lazy\" width=\"1022\" height=\"482\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2025\/03\/image-25-13.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1000\/2025\/03\/image-25-13.png 1000w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-25-13.png 1022w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>Considering the increase in vulnerabilities, there are many benefits of scanning Docker images with Trivy.<\/p>\n<p>Some of the benefits include:<\/p>\n<ol>\n<li><strong>Identifying vulnerabilities:<\/strong> Trivy can identify vulnerabilities in the packages used in your Docker images. This is particularly helpful in base image patching and application image builds.<\/li>\n<li><strong>Improving security posture:<\/strong> By scanning your images for vulnerabilities, you can improve the security posture of your organization.<\/li>\n<li><strong>Security Compliance:<\/strong> Many organizations are required to check their Docker images for vulnerabilities as part of the security compliance. You can achieve these standards with the help of Trivy.<\/li>\n<\/ol>\n<h2 id=\"conclusion\">Conclusion<\/h2>\n<p>Docker image vulnerability scanning is a must during development as well as during CI\/CD process. This ensures you follow good DevSecOps principles and implement best practices to maintain robust security in your Docker based environments.<\/p>\n<p>You can also use <a href=\"https:\/\/devopscube.com\/lint-dockerfiles-using-hadolint\/\">Hadolint<\/a>&nbsp;in your CI\/CD pipeline before vulnerability scan.<\/p>\n<hr>\n<p><strong>Ngu\u1ed3n:<\/strong> <a href=\"https:\/\/devopscube.com\/scan-docker-images-using-trivy\/\" target=\"_blank\" rel=\"noopener noreferrer\">Using Trivy Container Scanner to Detect Vulnerabilities (Comprehensive Guide) \u2014 DevOpsCube<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Source: https:\/\/devopscube.com\/scan-docker-images-using-trivy\/<\/p>\n","protected":false},"author":1,"featured_media":883,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-882","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops"],"_links":{"self":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/posts\/882","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=882"}],"version-history":[{"count":0,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/posts\/882\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/media\/883"}],"wp:attachment":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=882"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=882"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=882"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}