YAML parameters for Dockerfile Linter
PARAMETERS
typerequiredstring
Value: DOCKERFILE_LINTER
actionrequiredstring
Unique identifier for the action within the pipeline.local_pathstring
The path to the Dockerfile to lint.shell_typestring
The shell type to use for linting (e.g., bash, sh).ignore_codesstring
Comma-separated list of rule codes to ignore during linting.ignores_pathstring
The path to a file containing rules to ignore.trigger_timestring enum
Specifies when the action should be executed.Allowed enum:
ON_EVERY_EXECUTION,ON_SUCCESS,ON_FAILURE,ON_BACK_TO_SUCCESS,ON_WARNING,ON_WAIT_FOR_APPROVE,ON_TERMINATEloopstring[]
The list of variables for dynamic action execution. The action runs once for each value.run_only_on_first_failureboolean
Defines whether the action should be executed on each failure. Restricted to and required if the trigger_time is ON_FAILURE.disabledboolean
When set to true the action is disabled. By default it is set to false.timeoutinteger
The timeout in seconds.ignore_errorsboolean
If set to true the execution will proceed, mark action as a warning and jump to the next action. Doesn't apply to deployment actions.retry_intervalinteger
Delay time between auto retries in seconds.retry_countinteger
Number of retries if the action fails.run_nextstring enum
Defines whether the action should run in parallel with the next one.Allowed enum:
WAIT_ON_SUCCESS,IN_SOFT_PARALLEL,IN_HARD_PARALLELtrigger_conditionsTriggerConditionYaml[]
The list of trigger conditions to meet so that the action can be triggered.variablesVariableYaml[]
The list of variables you can use in the action.Dockerfile Linter error codes
| Code | Description |
|---|---|
| EL0001 | Invalid line. |
| ED0001 | All parser directives must be at the very top of the Dockerfile. |
| ED0002 | Directive appears more than once. |
| ED0003 | Directives should be lowercase. |
| ED0004 | Parser directive will be treated as a comment. |
| ED0005 | Missing value for directive. |
| ER0001 | Set the SHELL option -o(-eo for Alpine image) pipefail before RUN with a pipe in. |
| ER0002 | Delete the apt-get lists after installing something. |
| ER0003 | Use WORKDIR to switch to a directory. |
| ER0004 | Do not use sudo, consider using gosu. |
| ER0005 | Command (ssh,shutdown,service,ps,free,top,kill,mount) does not make sense in a container. |
| ER0006 | Using (apt-get upgrade,dist-upgrade,apk upgrade,apt install) is not recommended. |
| ER0007 | Either use wget or curl but not both. |
| ER0008 | Use SHELL to change the default shell. |
| ER0009 | Use the -y switch. |
| ER0010 | Avoid additional packages by specifying --no-install-recommends. |
| ER0011 | Use the --no-cache switch. |
| ER0012 | Pin versions in apt get install. |
| ER0013 | Pin versions in pip install. |
| ER0014 | Pin versions in npm install. |
| ER0015 | Pin versions in apk add. |
| ER0016 | Pin versions in gem install. |
| EU0001 | Last user should not be root. |
| EI0001 | There can only be one instruction like (CMD,HEALTHCHECK,ENTRYPOINT). |
| EI0002 | FROM may only be preceded by one or more ARG. |
| EI0003 | MAINTAINER is deprecated instead use LABEL. |
| EI0004 | Don't use (ONBUILD,FROM,MAINTAINTER) in ONBUILD. |
| EI0005 | Instructions should be uppercase. |
| EF0001 | Missing FROM. |
| EF0002 | FROM aliases must be unique. |
| EF0003 | Using latest is prone to errors if the image will ever update. |
| EF0004 | Always tag the version of an image explicitly. |
| EC0001 | COPY --from cannot reference its own FROM alias. |
| EC0002 | COPY --from should reference a previously defined FROM alias. |
| EC0003 | Use ADD for extracting archives into a image. |
| EC0004 | COPY with more than 2 arguments requires the last argument to end with /. |
| EJ0001 | You must use double-quotes (") in JSON array. |
| EJ0002 | CMD and ENTRYPOINT should be written in JSON form. |
| EJ0003 | SHELL must be written in JSON form. |
| EA0001 | Use curl or wget instead, and delete files when no longer needed. |
| EA0002 | Use COPY instead of ADD for files and folders. |
| EW0001 | Use absolute WORKDIR. |
| EE0001 | Valid UNIX ports range from 0 to 65535. |
Dockerfile Linter ShellCheck error codes
| Code | Description |
|---|---|
| SC1000 | $ is not used specially and should therefore be escaped. |
| SC1001 | This \o will be a regular 'o' in this context. |
| SC1003 | Want to escape a single quote? echo 'This is how it'''s done'. |
| SC1004 | This backslash+linefeed is literal. Break outside single quotes if you just want to break the line. |
| SC1007 | Remove space after = if trying to assign a value (or for empty string, use var='' ... ). |
| SC1008 | This shebang was unrecognized. ShellCheck only supports sh/bash/dash/ksh. Add a 'shell' directive to specify. |
| SC1009 | The mentioned parser error was in ... |
| SC1010 | Use semicolon or linefeed before 'done' (or quote to make it literal). |
| SC1011 | This apostrophe terminated the single quoted string! |
| SC1012 | \t is just literal t here. For tab, use "$(printf '\t')" instead. |
| SC1014 | Use 'if cmd; then ..' to check exit code, or 'if [ "$(cmd)" = .. ]' to check output. |
| SC1015 | This is a unicode double quote. Delete and retype it. |
| SC1016 | This is a Unicode single quote. Delete and retype it. |
| SC1017 | Literal carriage return. Run script through tr -d '\r' . |
| SC1018 | This is a unicode non-breaking space. Delete it and retype as space. |
| SC1019 | Expected this to be an argument to the unary condition. |
| SC1020 | You need a space before the if single then "]" else "]] |
| SC1026 | If grouping expressions inside [[..]], use ( .. ). |
| SC1028 | In [..] you have to escape \( \) or preferably combine [..] expressions. |
| SC1029 | In [[..]] you shouldn't escape ( or ). |
| SC1033 | Test expression was opened with double [[ but closed with single ]. Make sure they match. |
| SC1034 | Test expression was opened with double [ but closed with single ]] . Make sure they match. |
| SC1035 | You need a space here |
| SC1036 | ( is invalid here. Did you forget to escape it? |
| SC1037 | Braces are required for positionals over 9, e.g. ${10}. |
| SC1038 | Shells are space sensitive. Use '< <(cmd)', not '<<(cmd)'. |
| SC1039 | Remove indentation before end token (or use <<- and indent with tabs). |
| SC1040 | When using <<-, you can only indent with tabs. |
| SC1041 | Found 'eof' further down, but not on a separate line. |
| SC1042 | Close matches include '-eof' (!= 'eof'). |
| SC1044 | Couldn't find end token `EOF' in the here document. |
| SC1045 | It's not 'foo &; bar', just 'foo & bar'. |
| SC1046 | Couldn't find 'fi' for this 'if'. |
| SC1047 | Expected 'fi' matching previously mentioned 'if'. |
| SC1048 | Can't have empty then clauses (use 'true' as a no-op). |
| SC1049 | Did you forget the 'then' for this 'if'? |
| SC1050 | Expected 'then'. |
| SC1051 | Semicolons directly after 'then' are not allowed. Just remove it. |
| SC1052 | Semicolons directly after 'then' are not allowed. Just remove it. |
| SC1053 | Semicolons directly after 'else' are not allowed. Just remove it. |
| SC1054 | You need a space after the '{'. |
| SC1056 | Expected a '}'. If you have one, try a ; or \n in front of it. |
| SC1058 | Expected do. |
| SC1061 | Couldn't find 'done' for this 'do'. |
| SC1062 | Expected 'done' matching previously mentioned 'do'. |
| SC1064 | Expected a { to open the function definition. |
| SC1065 | Trying to declare parameters? Don't. Use () and refer to params as $1, $2.. |
| SC1066 | Don't use $ on the left side of assignments. |
| SC1067 | For indirection, use arrays, declare "var$n=value", or (for sh) read/eval |
| SC1068 | Don't put spaces around the = in assignments. |
| SC1069 | You need a space before the [. |
| SC1070 | Parsing stopped here. Mismatched keywords or invalid parentheses? |
| SC1071 | ShellCheck only supports sh/bash/dash/ksh scripts. Sorry! |
| SC1072 | Unexpected .. |
| SC1073 | Couldn't parse this (thing). Fix to allow more checks. |
| SC1074 | Did you forget the ;; after the previous case item? |
| SC1075 | Use 'elif' instead of 'else if'. |
| SC1077 | For command expansion, the tick should slant left (` vs ´). |
| SC1078 | Did you forget to close this double quoted string? |
| SC1079 | This is actually an end quote, but due to next char it looks suspect. |
| SC1081 | Scripts are case sensitive. Use 'if', not 'If'. |
| SC1082 | This file has a UTF-8 BOM. Remove it with: LC_CTYPE=C sed '1s/^...//' < yourscript. |
| SC1083 | This {/} is literal. Check expression (missing ;/\n?) or quote it. |
| SC1084 | Use #!, not !#, for the shebang. |
| SC1086 | Don't use $ on the iterator code in for loops. |
| SC1087 | Use braces when expanding arrays, e.g. ${array[idx]} (or ${var}[.. to quiet). |
| SC1088 | Parsing stopped here. Invalid use of parentheses? |
| SC1089 | Parsing stopped here. Is this keyword correctly matched up? |
| SC1090 | Can't follow non-constant source. Use a directive to specify location. |
| SC1091 | Not following: (error message here) |
| SC1094 | Parsing of sourced file failed. Ignoring it. |
| SC1095 | You need a space or linefeed between the function code and body. |
| SC1097 | Unexpected ==. For assignment, use =. For comparison, use [/[[. |
| SC1098 | Quote/escape special characters when using eval, e.g. eval "a=(b)". |
| SC1099 | You need a space before the #. |
| SC1100 | This is a unicode dash. Delete and retype as ASCII minus. |
| SC1101 | Delete trailing spaces after \ to break line (or use quotes for literal space). |
| SC1102 | Shells disambiguate $(( differently or not at all. For $(command substition), add space after $( . For $((arithmetics)), fix parsing errors. |
| SC1104 | Use #!, not just !, for the shebang. |
| SC1105 | Shells disambiguate (( differently or not at all. If the first ( should start a subshell, add a space after it. |
| SC1106 | In arithmetic contexts, use < instead of -lt. |
| SC1107 | This directive is unknown. It will be ignored. |
| SC1108 | You need a space before and after the = . |
| SC1109 | This is an unquoted HTML entity. Replace with corresponding character. |
| SC1110 | This is a unicode quote. Delete and retype it (or quote to make literal). |
| SC1111 | This is a unicode quote. Delete and retype it (or ignore/singlequote for literal). |
| SC1112 | This is a unicode quote. Delete and retype it (or ignore/doublequote for literal). |
| SC1113 | Use #!, not just #, for the shebang. |
| SC1114 | Remove leading spaces before the shebang. |
| SC1115 | Remove spaces between # and ! in the shebang. |
| SC1116 | Missing $ on a $((..)) expression? (or use ( ( for arrays). |
| SC1117 | Backslash is literal in "\n". Prefer explicit escaping: "\n". |
| SC1118 | Delete whitespace after the here-doc end token. |
| SC1119 | Add a linefeed between end token and terminating ')'. |
| SC1120 | No comments allowed after here-doc token. Comment the next line instead. |
| SC1121 | Add ;/& terminators (and other syntax) on the line with the <<, not here. |
| SC1122 | Nothing allowed after end token. To continue a command, put it on the line with the <<. |
| SC1123 | ShellCheck directives are only valid in front of complete compound commands, like if, not e.g. individual elif branches. |
| SC1124 | ShellCheck directives are only valid in front of complete commands like 'case' statements, not individual case branches. |
| SC1125 | Invalid key=value pair in directive |
| SC1126 | Place shellcheck directives before commands, not after. |
| SC1127 | Was this intended as a comment? Use # in sh. |
| SC1128 | The shebang must be on the first line. Delete blanks and move comments. |
| SC1129 | You need a space before the !. |
| SC1130 | You need a space before the :. |
| SC1131 | Use elif to start another branch. |
| SC1132 | This & terminates the command. Escape it or add space after & to silence. |
| SC1133 | Unexpected start of line. If breaking lines, |/||/&& should be at the end of the previous one. |
| SC1135 | Prefer escape over ending quote to make $ literal. Instead of "It costs $"5, use "It costs $5". |
| SC1136 | Unexpected characters after terminating ]. Missing semicolon/linefeed? |
| SC1139 | Use || instead of '-o' between test commands. |
| SC1140 | Unexpected parameters after condition. Missing &&/||, or bad expression? |
| SC1141 | Unexpected tokens after compound command. Bad redirection or missing ;/&&/||/|? |
| SC1142 | Use 'done < <(cmd)' to redirect from process substitution (currently missing one '<'). |
| SC1143 | This backslash is part of a comment and does not continue the line. |
| SC2000 | See if you can use ${#variable} instead. |
| SC2001 | See if you can use ${variable//search/replace} instead. |
| SC2002 | Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead. |
| SC2003 | expr is antiquated. Consider rewriting this using $((..)), ${} or []. |
| SC2004 | $/${} is unnecessary on arithmetic variables. |
| SC2005 | Problematic code: |
| SC2006 | Use $(...) notation instead of legacy backticked .... |
| SC2007 | Use $((..)) instead of deprecated $[..] |
| SC2008 | echo doesn't read from stdin, are you sure you should be piping to it? |
| SC2009 | SC2009 Consider using pgrep instead of grepping ps output. |
| SC2010 | Don't use ls | grep. Use a glob or a for loop with a condition to allow non-alphanumeric filecodes. |
| SC2011 | Use find -print0 or find -exec to better handle non-alphanumeric filecodes. |
| SC2012 | Use find instead of ls to better handle non-alphanumeric filecodes. |
| SC2013 | To read lines rather than words, pipe/redirect to a 'while read' loop. |
| SC2014 | This will expand once before find runs, not per file found. |
| SC2015 | Note that A && B || C is not if-then-else. C may run when A is true. |
| SC2016 | Expressions don't expand in single quotes, use double quotes for that. |
| SC2017 | Increase precision by replacing a/b\c with a\c/b. |
| SC2018 | Use '[:lower:]' to support accents and foreign alphabets. |
| SC2019 | Use '[:upper:]' to support accents and foreign alphabets. |
| SC2020 | tr replaces sets of chars, not words (mentioned due to duplicates). |
| SC2021 | Don't use [] around ranges in tr, it replaces literal square brackets. |
| SC2022 | Note that unlike globs, o* here matches 'ooo' but not 'oscar' |
| SC2024 | sudo doesn't affect redirects. Use ..| sudo tee file. |
| SC2025 | Make sure all escape sequences are enclosed in [..] to prevent line wrapping issues. |
| SC2026 | This word is outside of quotes. Did you intend to 'nest '"'single quotes'"' instead'? |
| SC2027 | The surrounding quotes actually unquote this. Remove or escape them. |
| SC2028 | echo won't expand escape sequences. Consider printf. |
| SC2029 | Note that, unescaped, this expands on the client side. |
| SC2030 | Modification of var is local (to subshell caused by pipeline). |
| SC2031 | var was modified in a subshell. That change might be lost. |
| SC2032 | Use own script or sh -c '..' to run this from su. |
| SC2033 | Shell functions can't be passed to external commands. |
| SC2034 | foo appears unused. Verify it or export it. |
| SC2035 | Use ./glob or -- glob so codes with dashes won't become options. |
| SC2036 | If you wanted to assign the output of the pipeline, use a=$(b | c) . |
| SC2037 | To assign the output of a command, use var=$(cmd) . |
| SC2038 | Use -print0/-0 or find -exec + to allow for non-alphanumeric filecodes. |
| SC2039 | In POSIX sh, something is undefined. |
| SC2040 | #!/bin/sh was specified, so ____ is not supported, even when sh is actually bash. |
| SC2041 | This is a literal string. To run as a command, use $(..) instead of '..' . |
| SC2043 | This loop will only ever run once for a constant value. Did you perhaps mean to loop over dir/*, $var or $(cmd)? |
| SC2044 | For loops over find output are fragile. Use find -exec or a while read loop. |
| SC2045 | Iterating over ls output is fragile. Use globs. |
| SC2046 | Quote this to prevent word splitting |
| SC2048 | Use "$@" (with quotes) to prevent whitespace problems. |
| SC2049 | =~ is for regex, but this looks like a glob. Use = instead. |
| SC2050 | This expression is constant. Did you forget the $ on a variable? |
| SC2051 | Bash doesn't support variables in brace range expansions. |
| SC2053 | Quote the rhs of = in [] to prevent glob matching. |
| SC2054 | Use spaces, not commas, to separate array elements. |
| SC2055 | You probably wanted && here, otherwise it's always true. |
| SC2056 | You probably wanted && here |
| SC2057 | Unknown binary operator. |
| SC2058 | Unknown unary operator. |
| SC2059 | Don't use variables in the printf format string. Use printf "..%s.." "$foo". |
| SC2060 | Quote parameters to tr to prevent glob expansion. |
| SC2061 | Quote the parameter to -code so the shell won't interpret it. |
| SC2062 | Quote the grep pattern so the shell won't interpret it. |
| SC2063 | Grep uses regex, but this looks like a glob. |
| SC2064 | Use single quotes, otherwise this expands now rather than when signalled. |
| SC2065 | This is interpreted as a shell file redirection, not a comparison. |
| SC2066 | Since you double quoted this, it will not word split, and the loop will only run once. |
| SC2067 | Missing ';' or + terminating -exec. You can't use |/||/&&, and ';' has to be a separate, quoted argument. |
| SC2068 | Double quote array expansions to avoid re-splitting elements. |
| SC2069 | To redirect stdout+stderr, 2>&1 must be last (or use '{ cmd > file; } 2>&1' to clarify). |
| SC2070 | -n doesn't work with unquoted arguments. Quote or use []. |
| SC2071 | > is for string comparisons. Use -gt instead. |
| SC2072 | Decimals are not supported. Either use integers only, or use bc or awk to compare. |
| SC2073 | Escape < to prevent it redirecting (or switch to [[ .. ]]). |
| SC2074 | Can't use =~ in . Use [[..]] instead. |
| SC2076 | Don't quote rhs of =~, it'll match literally rather than as a regex. |
| SC2077 | You need spaces around the comparison operator. |
| SC2078 | This expression is constant. Did you forget a $ somewhere? |
| SC2079 | (( )) doesn't support decimals. Use bc or awk. |
| SC2080 | Numbers with leading 0 are considered octal. |
| SC2081 | [ .. ] can't match globs. Use [[ .. ]] or grep. |
| SC2082 | To expand via indirection, use code="foo$n"; echo "${!code}". |
| SC2084 | Remove '$' or use '_=$((expr))' to avoid executing output. |
| SC2086 | Double quote to prevent globbing and word splitting. |
| SC2087 | Quote 'EOF' to make here document expansions happen on the server side rather than on the client. |
| SC2088 | Tilde does not expand in quotes. Use $HOME. |
| SC2089 | Quotes/backslashes will be treated literally. Use an array. |
| SC2090 | Quotes/backslashes in this variable will not be respected. |
| SC2091 | Remove surrounding $() to avoid executing output (or use eval if intentional). |
| SC2092 | Remove backticks to avoid executing output. |
| SC2093 | Remove "exec " if script should continue after this command. |
| SC2094 | SC2094 Make sure not to read and write the same file in the same pipeline. |
| SC2095 | Use ssh -n to prevent ssh from swallowing stdin. |
| SC2096 | On most OS, shebangs can only specify a single parameter. |
| SC2097 | This assignment is only seen by the forked process. |
| SC2098 | This expansion will not see the mentioned assignment. |
| SC2099 | Use $((..)) for arithmetics, e.g. i=$((i + 2)). |
| SC2100 | Use $((..)) for arithmetics, e.g. i=$((i + 2)). |
| SC2101 | coded class needs outer [], e.g. [[:digit:]\]. |
| SC2102 | Ranges can only match single chars (mentioned due to duplicates). |
| SC2103 | Use a ( subshell ) to avoid having to cd back. |
| SC2104 | In functions, use return instead of break. |
| SC2105 | break is only valid in loops. |
| SC2106 | This only exits the subshell caused by the pipeline. |
| SC2107 | Instead of [ a && b ], use [ a ] && [ b ]. |
| SC2108 | In [[..]], use && instead of -a. |
| SC2109 | Instead of [ a || b ], use [ a ] || [ b ]. |
| SC2110 | In [[..]], use || instead of -o. |
| SC2112 | 'function' keyword is non-standard. Delete it. |
| SC2113 | function keyword is non-standard. Use foo() instead of function foo. |
| SC2114 | Warning: deletes a system directory. |
| SC2115 | Use "${var:?}" to ensure this never expands to /* . |
| SC2116 | Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'. |
| SC2117 | To run commands as another user, use su -c or sudo. |
| SC2119 | Use foo "$@" if function's $1 should mean script's $1. |
| SC2120 | foo references arguments, but none are ever passed. |
| SC2121 | To assign a variable, use just 'var=value', no 'set ..'. |
| SC2122 | >= is not a valid operator. Use '! a < b' instead. |
| SC2123 | PATH is the shell search path. Use another code. |
| SC2124 | Assigning an array to a string! Assign as array, or use * instead of @ to concatenate. |
| SC2125 | Brace expansions and globs are literal in assignments. Quote it or use an array. |
| SC2126 | Consider using grep -c instead of grep | wc. |
| SC2128 | Expanding an array without an index only gives the first element. |
| SC2129 | Consider using { cmd1; cmd2; } >> file instead of individual redirects. |
| SC2130 | -eq is for integer comparisons. Use = instead. |
| SC2139 | This expands when defined, not when used. Consider escaping. |
| SC2140 | Word is on the form "A"B"C" (B indicated). Did you mean "ABC" or "A\"B\"C"? |
| SC2141 | Did you mean IFS=$'\t' ? |
| SC2142 | Aliases can't use positional parameters. Use a function. |
| SC2143 | Use grep -q instead of comparing output with [ -n .. ]. |
| SC2144 | -e doesn't work with globs. Use a for loop. |
| SC2145 | Argument mixes string and array. Use * or separate argument. |
| SC2146 | This action ignores everything before the -o. Use \( \) to group. |
| SC2147 | Literal tilde in PATH works poorly across programs. |
| SC2148 | shellcheck shell=bash |
| SC2149 | Remove $/${} for numeric index, or escape it for string. |
| SC2150 | -exec does not automatically invoke a shell. Use -exec sh -c .. for that. |
| SC2151 | Only one integer 0-255 can be returned. Use stdout for other data. |
| SC2152 | Can only return 0-255. Other data should be written to stdout. |
| SC2153 | Possible Misspelling: MYVARIABLE may not be assigned, but MY_VARIABLE is. |
| SC2154 | var is referenced but not assigned. |
| SC2155 | Declare and assign separately to avoid masking return values. |
| SC2156 | Injecting filecodes is fragile and insecure. Use parameters. |
| SC2157 | Argument to implicit -n is always true due to literal strings. |
| SC2158 | [ false ] is true. Remove the brackets |
| SC2159 | [ 0 ] is true. Use 'false' instead |
| SC2160 | Instead of '[ true ]', just use 'true'. |
| SC2161 | Instead of '[ 1 ]', use 'true'. |
| SC2162 | read without -r will mangle backslashes |
| SC2163 | This does not export 'FOO'. Remove $/${} for that, or use ${var?} to quiet. |
| SC2164 | Use cd ... || exit in case cd fails. |
| SC2165 | This nested loop overrides the index variable of its parent. |
| SC2166 | Prefer [ p ] && [ q ] as [ p -a q ] is not well defined. |
| SC2167 | This parent loop has its index variable overridden. |
| SC2168 | 'local' is only valid in functions. |
| SC2169 | In dash, something is not supported. |
| SC2170 | Numerical -eq does not dereference in [..]. Expand or use string operator. |
| SC2171 | Found trailing ] outside test. Add missing [ or quote if intentional. |
| SC2172 | Trapping signals by number is not well defined. Prefer signal codes. |
| SC2173 | SIGKILL/SIGSTOP can not be trapped. |
| SC2174 | When used with -p, -m only applies to the deepest directory. |
| SC2175 | Quote this invalid brace expansion since it should be passed literally to eval |
| SC2176 | 'time' is undefined for pipelines. time single stage or bash -c instead. |
| SC2177 | 'time' is undefined for compound commands, use time sh -c instead. |
| SC2178 | Variable was used as an array but is now assigned a string. |
| SC2179 | Use array+=("item") to append items to an array. |
| SC2180 | Bash does not support multidimensional arrays. Use 1D or associative arrays. |
| SC2181 | Check exit code directly with e.g. 'if mycmd;', not indirectly with $?. |
| SC2182 | This printf format string has no variables. Other arguments are ignored. |
| SC2183 | This format string has 2 variables, but is passed 1 arguments. |
| SC2184 | Quote arguments to unset so they're not glob expanded. |
| SC2185 | Some finds don't have a default path. Specify '.' explicitly. |
| SC2186 | tempfile is deprecated. Use mktemp instead. |
| SC2187 | Ash scripts will be checked as Dash. Add '# shellcheck shell=dash' to silence. |
| SC2188 | This redirection doesn't have a command. Move to its command (or use 'true' as no-op). |
| SC2189 | You can't have | between this redirection and the command it should apply to. |
| SC2190 | Elements in associative arrays need index, e.g. array=( [index]=value ) . |
| SC2191 | The = here is literal. To assign by index, use ( [index]=value ) with no spaces. To keep as literal, quote it. |
| SC2192 | This array element has no value. Remove spaces after = or use "" for empty string. |
| SC2193 | The arguments to this comparison can never be equal. Make sure your syntax is correct. |
| SC2194 | This word is constant. Did you forget the $ on a variable? |
| SC2195 | This pattern will never match the case statement's word. Double check them. |
| SC2196 | egrep is non-standard and deprecated. Use grep -E instead. |
| SC2197 | fgrep is non-standard and deprecated. Use grep -F instead. |
| SC2198 | Arrays don't work as operands in . Use a loop (or concatenate with * instead of @). |
| SC2199 | Arrays implicitly concatenate in []. Use a loop (or explicit * instead of @). |
| SC2200 | Brace expansions don't work as operands in . Use a loop. |
| SC2201 | Brace expansion doesn't happen in []. Use a loop. |
| SC2202 | Globs don't work as operands in . Use a loop. |
| SC2203 | Globs are ignored in [] except right of =/!=. Use a loop. |
| SC2204 | (..) is a subshell. Did you mean [ .. ], a test expression? |
| SC2205 | (..) is a subshell. Did you mean [ .. ], a test expression? |
| SC2206 | Quote to prevent word splitting/globbing, or split robustly with mapfile or read -a. |
| SC2207 | Prefer mapfile or read -a to split command output (or quote to avoid splitting). |
| SC2208 | Use [] or quote arguments to -v to avoid glob expansion. |
| SC2209 | Use var=$(command) to assign output (or quote to assign string). |
| SC2210 | This is a file redirection. Was it supposed to be a comparison or fd operation? |
| SC2211 | This is a glob used as a command code. Was it supposed to be in $(..), array, or is it missing quoting? |
| SC2212 | Use 'false' instead of empty [/[[ conditionals. |
| SC2213 | getopts specified -n, but it's not handled by this 'case'. |
| SC2214 | This case is not specified by getopts. |
| SC2215 | This flag is used as a command code. Bad line break or missing [ .. ]? |
| SC2216 | Piping to 'rm', a command that doesn't read stdin. Wrong command or missing xargs? |
| SC2217 | Redirecting to 'echo', a command that doesn't read stdin. Bad quoting or missing xargs? |
| SC2218 | This function is only defined later. Move the definition up. |
| SC2219 | Instead of let expr, prefer (( expr )). |
| SC2220 | Invalid flags are not handled. Add a *) case. |
| SC2221 | This pattern always overrides a later one. |
| SC2222 | This pattern never matches because of a previous pattern. |
| SC2223 | This default assignment may cause DoS due to globbing. Quote it. |
| SC2224 | This mv has no destination. Check the arguments. |
| SC2225 | This cp has no destination. Check the arguments. |
| SC2226 | This ln has no destination. Check the arguments, or specify '.' explicitly. |
| SC2227 | Redirection applies to the find command itself. Rewrite to work per action (or move to end). |
| SC2229 | This does not read 'foo'. Remove $/{} for that, or use ${var?} to quiet. |
| SC2230 | which is non-standard. Use builtin 'command -v' instead. |
| SC2231 | Quote expansions in this for loop glob to prevent wordsplitting, e.g. "$dir"/*.txt . |
| SC2232 | Can't use sudo with builtins like cd. Did you want sudo sh -c .. instead? |
| SC2233 | Remove superfluous (..) around condition. |
| SC2234 | Remove superfluous (..) around test command. |
| SC2235 | Use { ..; } instead of (..) to avoid subshell overhead. |
| SC2236 | Use -n instead of ! -z. |
| SC2237 | Use [ -n .. ] instead of ! [ -z .. ]. |
| SC2238 | Redirecting to/from command code instead of file. Did you want pipes/xargs (or quote to ignore)? |
| SC2239 | Ensure the shebang uses the absolute path to the interpreter. |
| SC2240 | The dot command does not support arguments in sh/dash. Set them as variables. |
| SC2241 | The exit status can only be one integer 0-255. Use stdout for other data. |
| SC2242 | Can only exit with status 0-255. Other data should be written to stdout/stderr. |
| SC2243 | Prefer explicit -n to check for output (or run command without [/[[ to check for success) |
| SC2244 | Prefer explicit -n to check non-empty string (or use =/-ne to check boolean/integer). |
| SC2245 | -d only applies to the first expansion of this glob. Use a loop to check any/all. |
| SC2246 | This shebang specifies a directory. Ensure the interpreter is a file. |
| SC2247 | Flip leading $ and " if this should be a quoted substitution. |
| SC2248 | Warn about variable references without braces. |
| SC2249 | Consider adding a default *) case, even if it just exits with error. |
| SC2250 | Prefer putting braces around variable references even when not strictly required. |
| SC2251 | This ! is not on a condition and skips errexit. Use && exit 1 instead, or make sure $? is checked. |
| SC2252 | You probably wanted && here, otherwise it's always true. |
| SC2253 | Use -R to recurse, or explicitly a-r to remove read permissions. |
| SC2254 | Quote expansions in case patterns to match literally rather than as a glob. |
| SC2255 | does not apply arithmetic evaluation. Evaluate with $((..)) for numbers, or use string comparator for strings. |
| SC2256 | This translated string is the code of a variable. Flip leading $ and " if this should be a quoted substitution. |
| SC2257 | Arithmetic modifications in command redirections may be discarded. Do them separately. |
| SC2259 | This redirection overrides piped input. To use both, merge or pass filecodes. |
| SC2260 | This redirection overrides the output pipe. Use 'tee' to output to both. |
| SC2261 | Multiple redirections compete for stdout. Use cat, tee, or pass filecodes instead. |
| SC2262 | This alias can't be defined and used in the same parsing unit. Use a function instead. |
| SC2263 | Since they're in the same parsing unit, this command will not refer to the previously mentioned alias. |
| SC2264 | This function unconditionally re-invokes itself. Missing command? |
| SC2267 | GNU xargs -i is deprecated in favor of -I{} |
| SC2268 | Avoid x-prefix in comparisons as it no longer serves a purpose. |
| SC2269 | This variable is assigned to itself, so the assignment does nothing. |
| SC2270 | To assign positional parameters, use 'set -- first second ..' (or use to compare). |
| SC2271 | For indirection, use arrays, declare "var$n=value", or (for sh) read/eval |
| SC2272 | Command code contains ==. For comparison, use [ "$var" = value ]. |
| SC2273 | Sequence of ===s found. Merge conflict or intended as a commented border? |
| SC2274 | Command code starts with ===. Intended as a commented border? |
| SC2275 | Command code starts with =. Bad line break? |
| SC2276 | This is interpreted as a command code containing '='. Bad assignment or comparison? |
| SC2277 | Use BASH_ARGV0 to assign to $0 in bash (or use to compare). |
| SC2278 | $0 can't be assigned in Ksh (but it does reflect the current function). |
| SC2279 | $0 can't be assigned in Dash. This becomes a command code. |
| SC2280 | $0 can't be assigned this way, and there is no portable alternative. |
| SC2281 | Don't use $/${} on the left side of assignments. |
| SC2282 | Variable codes can't start with numbers, so this is interpreted as a command. |
| SC2283 | Use to compare values, or remove spaces around = to assign (or quote '=' if literal). |
| SC2284 | Use [ x = y ] to compare values (or quote '==' if literal). |
| SC2285 | Remove spaces around += to assign (or quote '+=' if literal). |
| SC3001 | In POSIX sh, process substitution is undefined. |
| SC3002 | In POSIX sh, extglob is undefined. |
| SC3003 | In POSIX sh, $'..' is undefined. |
| SC3006 | In POSIX sh, standalone ((..)) is undefined. |
| SC3012 | In POSIX sh, lexicographical < is undefined. |
| SC3013 | In POSIX sh, -nt is undefined. |
| SC3014 | In POSIX sh, == in place of = is undefined. |
| SC3017 | In POSIX sh, unary -a in place of -e is undefined. |
| SC3018 | In POSIX sh, ++ is undefined. |
| SC3019 | In POSIX sh, exponentials are undefined. |
| SC3020 | In POSIX sh, &> is undefined. |
| SC3021 | In POSIX sh, >& is undefined. |
| SC3022 | In POSIX sh, coded file descriptors is undefined. |
| SC3023 | In POSIX sh, FDs outside of 0-9 are undefined. |
| SC3024 | In POSIX sh, += is undefined. |
| SC3025 | In POSIX sh, /dev/tcp,udp is undefined. |
| SC3026 | In POSIX sh, ^ in place of ! in glob bracket expressions is undefined. |
| SC3028 | In POSIX sh, VARIABLE is undefined. |
| SC3031 | In POSIX sh, redirecting from/to globs is undefined. |
| SC3034 | In POSIX sh, $(<file) is undefined. |
| SC3035 | In POSIX sh, < <file is undefined. |
| SC3037 | In POSIX sh, echo flags are undefined. |
| SC3038 | In POSIX sh, exec flags are undefined. |
| SC3039 | In POSIX sh, 'let' is undefined. |
| SC3043 | In POSIX sh, local is undefined. |
| SC3044 | In POSIX sh, declare is undefined. |
| SC3045 | In POSIX sh, some-command-with-flag is undefined. |
| SC3046 | In POSIX sh, source in place of . is undefined. |
| SC3047 | In POSIX sh, trapping ERR is undefined. |
| SC3048 | In POSIX sh, prefixing signal codes with 'SIG' is undefined. |
| SC3049 | In POSIX sh, using lower/mixed case for signal codes is undefined. |
| SC3050 | In POSIX sh, printf %q is undefined. |
| SC3053 | In POSIX sh, indirect expansion is undefined. |
| SC3054 | In POSIX sh, array references are undefined. |
| SC3055 | In POSIX sh, array key expansion is undefined. |
| SC3056 | In POSIX sh, code matching prefixes are undefined. |
| SC3057 | In POSIX sh, string indexing is undefined. |
| SC3060 | In POSIX sh, string replacement is undefined. |
Last modified on Apr 27, 2026
YAML examples for Dockerfile Linter
Lint Dockerfile with ignore codes
yaml- action: "Lint Dockerfile" type: "DOCKERFILE_LINTER" local_path: "Dockerfile" shell_type: "sh" ignore_codes: "ER0012,ER0015,SC1017,SC2020" ignores_path: "ignores.yaml"