The code looks good. One thing you might want to consider is using applicative style for parsing. So
taggedImage :: Parser BaseImage
taggedImage = do
name <- many (noneOf ":")
reservedOp ":"
tag <- many (noneOf "\n")
return $ TaggedImage name tag
Would end up something like:
taggedImage :: Parser BaseImage
taggedImage = TaggedImage <$> (many (noneOf "\n") <* reservedOp ":")
<*> (many (noneOf "\n")