Dockerfile parser and hadolint-style linter for MoonBit
moon add spectacleCase/moonhadolintmoon test
moon run --target native cmd/main -- sample
moon run --target native cmd/main -- lint -
moon run --target native cmd/main -- json examples/bad.Dockerfile
moon run --target native cmd/main -- annotate examples/bad.Dockerfile
moon run --target native cmd/main -- lint --ignore DL3006 examples/bad.Dockerfile
moon run --target native cmd/main -- parse examples/good.Dockerfile
moon run --target native cmd/main -- lint examples/multistage.Dockerfilemoonhadolint lint [--ignore CODE] [--config FILE] <Dockerfile>
moonhadolint json [--ignore CODE] [--config FILE] <Dockerfile>
moonhadolint annotate [--ignore CODE] [--config FILE] <Dockerfile>
moonhadolint parse <Dockerfile>
moonhadolint sample
moonhadolint bad-sample
moonhadolint rules///|
test "lint clean sample" {
let result = @moonhadolint.lint_source(@moonhadolint.sample_dockerfile()).unwrap()
inspect(result.diagnostics.length(), content="0")
inspect(result.instruction_count, content="6")
}///|
test "parse FROM line" {
let doc = @moonhadolint.parse_dockerfile("FROM alpine:3.19\n").unwrap()
assert_true(doc.instructions[0].kind is From)
inspect(doc.instructions[0].arguments, content="alpine:3.19")
}///|
test "catalog includes FROM tag rule" {
assert_true(@moonhadolint.has_rule("DL3006"))
}pub(all) struct ExecNode {
form : InstructionForm
argv : Array[String]
raw : String
} derive(Eq, Debug)pub(all) struct Instruction {
kind : InstructionKind
name : String
arguments : String
line : Int
form : InstructionForm
stage : String?
copy_from : String?
ignored_codes : Array[String]
node : Node
} derive(Debug)pub(all) struct RunNode {
form : InstructionForm
script : String
argv : Array[String]
has_pipe : Bool
has_heredoc : Bool
} derive(Eq, Debug)Install
Download zipDockerfile parser and hadolint-style linter for MoonBit