{"id":404876,"date":"2022-02-07T17:03:34","date_gmt":"2022-02-07T14:03:34","guid":{"rendered":"https:\/\/en.buradabiliyorum.com\/how-to-use-hadolint-to-lint-your-dockerfiles-cloudsavvy-it\/"},"modified":"2022-02-07T17:03:34","modified_gmt":"2022-02-07T14:03:34","slug":"how-to-use-hadolint-to-lint-your-dockerfiles-cloudsavvy-it","status":"publish","type":"post","link":"https:\/\/buradabiliyorum.com\/en\/how-to-use-hadolint-to-lint-your-dockerfiles-cloudsavvy-it\/","title":{"rendered":"#How to Use Hadolint to Lint Your Dockerfiles \u2013 CloudSavvy IT"},"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-6a2c364d13b0e\" 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-6a2c364d13b0e\" 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-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-use-hadolint-to-lint-your-dockerfiles-cloudsavvy-it\/#Getting_Started\" >Getting Started<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-use-hadolint-to-lint-your-dockerfiles-cloudsavvy-it\/#Linting_a_Dockerfile\" >Linting a Dockerfile<\/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-use-hadolint-to-lint-your-dockerfiles-cloudsavvy-it\/#What_Does_Hadolint_Look_For\" >What Does Hadolint Look For?<\/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-use-hadolint-to-lint-your-dockerfiles-cloudsavvy-it\/#Customizing_Configuration\" >Customizing Configuration<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-use-hadolint-to-lint-your-dockerfiles-cloudsavvy-it\/#Trusting_Registries\" >Trusting Registries<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-use-hadolint-to-lint-your-dockerfiles-cloudsavvy-it\/#Label_Schemas\" >Label Schemas<\/a><\/li><\/ul><\/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-use-hadolint-to-lint-your-dockerfiles-cloudsavvy-it\/#Output_Formats\" >Output Formats<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/buradabiliyorum.com\/en\/how-to-use-hadolint-to-lint-your-dockerfiles-cloudsavvy-it\/#Summary\" >Summary<\/a><\/li><\/ul><\/nav><\/div>\n<p><strong>&#8220;#How to Use Hadolint to Lint Your Dockerfiles \u2013 CloudSavvy IT&#8221;<\/strong><\/p>\n<div id=\"article-content-area\">\n<img loading=\"lazy\" decoding=\"async\" class=\"type:primaryImage aligncenter size-full wp-image-14169\" data-pagespeed-lazy-srcset=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/09\/993634a1.png?width=398&amp;trim=1,1&amp;bg-color=000&amp;pad=1,1 400w, https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/09\/993634a1.png?width=1198&amp;trim=1,1&amp;bg-color=000&amp;pad=1,1 1200w\" sizes=\"auto, 400w, 1200w\" data-pagespeed-lazy-src=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/09\/993634a1.png?width=1198&amp;trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"\" width=\"1200\" height=\"675\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><\/p>\n<p>Dockerfiles define the content of Docker images as a set of instructions in a text file. The Dockerfile syntax is <a href=\"https:\/\/buradabiliyorum.com\/en\/category\/general\/\" data-internallinksmanager029f6b8e52c=\"3\" title=\"General\" target=\"_blank\" rel=\"noopener\">general<\/a>ly straightforward but there are some gotchas to avoid. Adhering to best practices while writing complex Dockerfiles in a team setting can be tricky unless you\u2019re automatically validating your file\u2019s content.<\/p>\n<p><a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/hadolint\/hadolint\">Hadolint<\/a> is a Dockerfile linter that can spot common issues for you. It uses an abstract syntax tree (AST) to parse your Dockerfile against predefined rulesets. Hadolint also incorporates <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/www.shellcheck.net\">ShellCheck<\/a> so it can lint the shell <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\">script<\/a>s in your Dockerfile\u2019s <code>RUN<\/code> instructions too.<\/p>\n<h2 id=\"getting-started\"><span class=\"ez-toc-section\" id=\"Getting_Started\"><\/span>Getting Started<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Hadolint is distributed in multiple formats. You can quickly get started by downloading the latest pre-compiled binary for your operating system from the project\u2019s <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/hadolint\/hadolint\/releases\">GitHub releases<\/a> page.<br \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-15161\" data-pagespeed-lazy-src=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/12\/971de3d5.png?trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"\" width=\"850\" height=\"665\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><br \/>Hadolint\u2019s also got its own own Docker image, <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/hub.docker.com\/r\/hadolint\/hadolint\"><code>hadolint\/hadolint<\/code><\/a>, if you\u2019d rather not use the binary directly. As a final option, you can access Hadolint <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/hadolint\/hadolint\">via the web<\/a> for experimentation.<\/p>\n<h2 id=\"linting-a-dockerfile\"><span class=\"ez-toc-section\" id=\"Linting_a_Dockerfile\"><\/span>Linting a Dockerfile<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Pass Hadolint the path to a Dockerfile to start a new scan:<\/p>\n<pre>hadolint Dockerfile<\/pre>\n<p>If you\u2019re using the Dockerized version, it\u2019s easiest to pipe the contents of your file into a Hadolint container:<\/p>\n<pre>docker run --rm -i hadolint\/hadolint &lt; Dockerfile<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-15234\" data-pagespeed-lazy-src=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2022\/01\/3a143e45.png?trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"\" width=\"1253\" height=\"322\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><br \/>The scan results will be shown in your terminal. In this example, Hadolint is suggesting that the Dockerfile\u2019s <code>RUN apt-get install<\/code> statement is unsafe as it doesn\u2019t specify explicit package versions. The content of your image could change in-between builds, potentially creating confusing problems.<\/p>\n<h2 id=\"what-does-hadolint-look-for\"><span class=\"ez-toc-section\" id=\"What_Does_Hadolint_Look_For\"><\/span>What Does Hadolint Look For?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Hadolint has dozens of <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/hadolint\/hadolint#rules\">built-in rules<\/a> that check for common configuration and security issues. The linter aims to make your Dockerfiles compliant with the image building <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/docs.docker.com\/develop\/develop-images\/dockerfile_best-practices\">best practices<\/a> suggested by Docker.<\/p>\n<p>Included checks cover use of non-root final users, referencing a relative path in a <code>WORKDIR<\/code> statement, adding multiple <code>HEALTHCHECK<\/code> instructions, and not using explicitly pinned tags and versions. As Hadolint also inherits the ShellCheck ruleset, it\u2019ll surface common Bash scripting problems which that tool identifies too.<\/p>\n<p>Rules are identified as numbers prefixed with either <code>HL<\/code> or <code>SC<\/code>. <code>HL<\/code> rules are part of Hadolint whereas <code>SC<\/code> entries come from ShellCheck. Each check is given a severity from Error through to Info. If you get Errors in your scan results, those should be the first issues you resolve.<\/p>\n<h2 id=\"customizing-configuration\"><span class=\"ez-toc-section\" id=\"Customizing_Configuration\"><\/span>Customizing Configuration<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Hadolint is configured via a <code>.hadolint.yaml<\/code> file. It will search <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/hadolint\/hadolint#configure\">multiple locations<\/a> including your working, <code>.config<\/code>, and home directories. Only the first found file is used \u2013 there\u2019s no merging between locations.<\/p>\n<p>The config file lets you customize your scans by ignoring rules and changing their severities. While the default ruleset covers recommended best practices, you might find some checks don\u2019t apply in your environment. Committing a <code>.hadolint.yaml<\/code> file alongside your Dockerfile lets you tailor Hadolint scans accordingly. Most config file fields are also supported as CLI flags and environment variables.<\/p>\n<p>Rules are disabled by the <code>ignored<\/code> field. This should be a list of rule IDs:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"yaml\">\n<pre class=\"de1\"><span class=\"co4\">ignored<\/span><span class=\"sy2\">:\n<\/span>  - DL3010\n  - DL3020<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>If you need to lower a rule\u2019s severity without disabling it entirely, use the <code>override<\/code> key instead. This also lets you promote a low severity issue to a higher level. Use this if you want to place greater emphasis on a particular issue.<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"yaml\">\n<pre class=\"de1\"><span class=\"co4\">override<\/span>:<span class=\"co4\">\n  warning<\/span><span class=\"sy2\">:\n<\/span>    - DL3020<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>This demotes rule DL3020 from its default \u201cerror\u201d level to the less serious \u201cwarning.\u201d This rule requires you use <code>COPY<\/code> instead of <code>ADD<\/code> when referencing files and folders in your build context.<\/p>\n<p>You can adjust the global severity level too. Setting the <code>failure-threshold<\/code> field instructs Hadolint to exit with a failure status if any test reports an error at the given severity level:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"yaml\">\n<pre class=\"de1\"><span class=\"co3\">failure-threshold<\/span><span class=\"sy2\">: <\/span>warning<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>This instruction means the Hadolint scan will fail if there\u2019s either an error or a warning in its output.<\/p>\n<p>You can disable exiting with a failure code using the <code>no-fail: true<\/code> config option or the <code>--no-fail<\/code> CLI flag. This will instruct Hadolint to exit with a <code>0<\/code> code irrespective of the actual test outcome. It can be useful if you want to include Hadolint as a non-blocking job in a CI pipeline.<\/p>\n<h3 id=\"trusting-registries\"><span class=\"ez-toc-section\" id=\"Trusting_Registries\"><\/span>Trusting Registries<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Another use of the config file is to define trusted registries which you want to be able to reference in your Dockerfiles. When the <code>trustedRegistries<\/code> field is set, Hadolint will warn you when an image from another registry is used:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"yaml\">\n<pre class=\"de1\"><span class=\"co4\">trustedRegistries<\/span><span class=\"sy2\">:\n<\/span>  - docker.io\n  - docker-registry.example.com<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h3 id=\"label-schemas\"><span class=\"ez-toc-section\" id=\"Label_Schemas\"><\/span>Label Schemas<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Hadolint offers basic label linting too. This lets you enforce that labels added to your image by Dockerfile <code>LABEL<\/code> instructions comply with specified constraints. Here\u2019s an example of how it works:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"yaml\">\n<pre class=\"de1\"><span class=\"co4\">label-schema<\/span>:<span class=\"co3\">\n  notes<\/span><span class=\"sy2\">: <\/span>text<span class=\"co3\">\n  app-version<\/span><span class=\"sy2\">: <\/span>semver<span class=\"co3\">\n  built-at<\/span><span class=\"sy2\">: <\/span>rfc3339<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>This config snippet defines data types for four labels you can use in your Dockerfile. <code>notes<\/code> is declared as an arbitrary text field while <code>app-version<\/code> must be a <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/semver.org\">semver-compatible<\/a> version identifier. <code>built-at<\/code> is marked as an RFC-3339 datetime string. You can get the full list of supported types in the <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/hadolint\/hadolint#linting-labels\">Hadolint docs<\/a>.<\/p>\n<p>Hadolint permits use of labels that aren\u2019t listed in your schema. You can disable this and restrict <code>LABEL<\/code> instructions to only those present in the schema by setting <code>strict-labels: true<\/code> or using the <code>--strict-labels<\/code> flag.<\/p>\n<h2 id=\"output-formats\"><span class=\"ez-toc-section\" id=\"Output_Formats\"><\/span>Output Formats<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Several output formats are supported via the <code>format<\/code> option or <code>--format<\/code> flag. The default is <code>tty<\/code> which emits colorized output to your terminal. Colors can be disabled with the <code>--no-color<\/code> flag.<\/p>\n<p>The following alternative formatters are available:<\/p>\n<ul>\n<li><strong><code>json<\/code><\/strong> \u2013 Provides the list of detected issues as a verbose JSON structure that\u2019s ideal for use with your own scripts.<\/li>\n<li><strong><code>checkstyle<\/code><\/strong> \u2013 A <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/checkstyle.sourceforge.io\">Checkstyle<\/a> compatible report.<\/li>\n<li><strong><code>codeclimate<\/code><\/strong> \u2013 A <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/codeclimate\/codeclimate\">Code Climate<\/a> compatible report.<\/li>\n<li><strong><code>gitlab_codeclimate<\/code><\/strong> \u2013 Variation of the Code Climate report that works with GitLab\u2019s <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/docs.gitlab.com\/ee\/user\/project\/merge_requests\/code_quality.html\">integrated code quality<\/a> features. This lets you view errors as a widget on merge request pages when running Hadolint with GitLab CI.<\/li>\n<\/ul>\n<p>These output formats are ideal for using Hadolint programmatically or as part of a CI pipeline.<\/p>\n<h2 id=\"summary\"><span class=\"ez-toc-section\" id=\"Summary\"><\/span>Summary<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Hadolint automates the detection of Dockerfile issues. This helps your Docker images adhere to best practices and organizational standards. The default configuration is a good starting point but you can customize it to fit your needs by reclassifying and disabling rules.<\/p>\n<p>You should consider integrating Hadolint with your CI tool to get instant reports as Dockerfile changes are committed. This accelerates code review by giving developers im<a href=\"https:\/\/buradabiliyorum.com\/en\/category\/social-mediaa\/\" data-internallinksmanager029f6b8e52c=\"1\" title=\"Social Media\" target=\"_blank\" rel=\"noopener\">media<\/a>te visibility into problems. You can also use the tool locally while you work via community-supported <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/michaellzc\/vscode-hadolint\">editor extensions<\/a>, providing an even shorter feedback loop.\n<\/div>\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.cloudsavvyit.com\/15242\/how-to-use-hadolint-to-lint-your-dockerfiles\/\" target=\"_blank\" rel=\"noopener\">Source<\/a><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8220;#How to Use Hadolint to Lint Your Dockerfiles \u2013 CloudSavvy IT&#8221; Dockerfiles define the content of Docker images as a set of instructions in a text file. The Dockerfile syntax is generally straightforward but there are some gotchas to avoid. Adhering to best practices while writing complex Dockerfiles in a team setting can be tricky&#8230;<\/p>\n","protected":false},"author":1,"featured_media":404877,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/09\/993634a1.png","fifu_image_alt":"","footnotes":""},"categories":[18],"tags":[],"class_list":["post-404876","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\/404876","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=404876"}],"version-history":[{"count":0,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts\/404876\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/media\/404877"}],"wp:attachment":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/media?parent=404876"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/categories?post=404876"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/tags?post=404876"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}