packages feed

hadolint-2.0.0: src/Hadolint/Rule/DL4003.hs

module Hadolint.Rule.DL4003 (rule) where

import Hadolint.Rule
import Language.Docker.Syntax (Instruction (..))

data HasCmd = HasCmd | NoCmd

rule :: Rule args
rule = customRule check (emptyState NoCmd)
  where
    code = "DL4003"
    severity = DLWarningC
    message =
      "Multiple `CMD` instructions found. If you list more than one `CMD` then only the last \
      \`CMD` will take effect"

    -- Reset the state each time we find a FROM
    check _ st From {} = st |> replaceWith NoCmd
    -- Remember we found a CMD, fail if we found a CMD before
    check _ st@(State _ NoCmd) Cmd {} = st |> replaceWith HasCmd
    -- If we already saw a CMD, add an error for the line
    check line st@(State _ HasCmd) Cmd {} = st |> addFail (CheckFailure {..})
    -- otherwise return the accumulator
    check _ st _ = st
{-# INLINEABLE rule #-}