diff --git a/language-dockerfile.cabal b/language-dockerfile.cabal
--- a/language-dockerfile.cabal
+++ b/language-dockerfile.cabal
@@ -3,7 +3,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           language-dockerfile
-version:        0.3.2.0
+version:        0.3.3.0
 synopsis:       Dockerfile linter, parser, pretty-printer and embedded DSL
 description:     Forked from @hadolint@.
                 .
@@ -170,6 +170,8 @@
       Language.Dockerfile.EDSL.PluginsSpec
       Language.Dockerfile.EDSL.QuasiSpec
       Language.Dockerfile.EDSLSpec
+      Language.Dockerfile.ExamplesSpec
+      Language.Dockerfile.ParserSpec
       SanitySpec
       Spec
   default-language: Haskell2010
@@ -198,10 +200,13 @@
     , Glob
     , directory
     , filepath
+    , process
   other-modules:
       Language.Dockerfile.EDSL.PluginsSpec
       Language.Dockerfile.EDSL.QuasiSpec
       Language.Dockerfile.EDSLSpec
+      Language.Dockerfile.ExamplesSpec
+      Language.Dockerfile.ParserSpec
       SanitySpec
       Test
   default-language: Haskell2010
diff --git a/src/Language/Dockerfile.hs b/src/Language/Dockerfile.hs
--- a/src/Language/Dockerfile.hs
+++ b/src/Language/Dockerfile.hs
@@ -38,6 +38,8 @@
     , Language.Dockerfile.EDSL.cmdArgs
     , Language.Dockerfile.EDSL.workdir
     , Language.Dockerfile.EDSL.expose
+    , Language.Dockerfile.EDSL.ports
+    , Language.Dockerfile.EDSL.port
     , Language.Dockerfile.EDSL.volume
     , Language.Dockerfile.EDSL.entrypoint
     , Language.Dockerfile.EDSL.entrypointArgs
@@ -62,7 +64,7 @@
     , Language.Dockerfile.Syntax.BaseImage(..)
     , Language.Dockerfile.Syntax.Image
     , Language.Dockerfile.Syntax.Tag
-    , Language.Dockerfile.Syntax.Port
+    , Language.Dockerfile.Syntax.Ports
     , Language.Dockerfile.Syntax.Directory
     , Language.Dockerfile.Syntax.Source
     , Language.Dockerfile.Syntax.Destination
diff --git a/src/Language/Dockerfile/EDSL.hs b/src/Language/Dockerfile/EDSL.hs
--- a/src/Language/Dockerfile/EDSL.hs
+++ b/src/Language/Dockerfile/EDSL.hs
@@ -103,6 +103,12 @@
 digested :: String -> ByteString -> EBaseImage
 digested = EDigestedImage
 
+ports :: [Integer] -> Syntax.Ports
+ports = Syntax.Ports
+
+port :: Integer -> Syntax.Ports
+port = Syntax.Ports . (:[])
+
 run :: MonadFree EInstruction m => String -> m ()
 run = runArgs . words
 
diff --git a/src/Language/Dockerfile/EDSL/Types.hs b/src/Language/Dockerfile/EDSL/Types.hs
--- a/src/Language/Dockerfile/EDSL/Types.hs
+++ b/src/Language/Dockerfile/EDSL/Types.hs
@@ -2,7 +2,7 @@
 module Language.Dockerfile.EDSL.Types
   where
 
-import           Data.ByteString.Char8 (ByteString)
+import           Data.ByteString.Char8      (ByteString)
 import           Data.String
 import qualified Language.Dockerfile.Syntax as Syntax
 
@@ -23,7 +23,7 @@
                        | RunArgs Syntax.Arguments next
                        | CmdArgs Syntax.Arguments next
                        | Workdir Syntax.Directory next
-                       | Expose [Syntax.Port] next
+                       | Expose Syntax.Ports next
                        | Volume String next
                        | EntrypointArgs Syntax.Arguments next
                        | Maintainer String next
diff --git a/src/Language/Dockerfile/Parser.hs b/src/Language/Dockerfile/Parser.hs
--- a/src/Language/Dockerfile/Parser.hs
+++ b/src/Language/Dockerfile/Parser.hs
@@ -1,11 +1,10 @@
 module Language.Dockerfile.Parser where
 
-import           Text.Parsec                   hiding (label)
-import           Text.Parsec.String            (Parser)
-
 import           Control.Monad                 (void)
 import           Data.ByteString.Char8         (pack)
-
+import           Data.String
+import           Text.Parsec                   hiding (label)
+import           Text.Parsec.String            (Parser)
 import qualified Text.Parsec.Token             as Token
 
 import           Language.Dockerfile.Lexer
@@ -136,8 +135,9 @@
 expose :: Parser Instruction
 expose = do
   reserved "EXPOSE"
-  ports <- many natural
-  return $ Expose ports
+  sports <- untilEol
+  let port = fromString sports
+  return $ Expose port
 
 run :: Parser Instruction
 run = do
diff --git a/src/Language/Dockerfile/PrettyPrint.hs b/src/Language/Dockerfile/PrettyPrint.hs
--- a/src/Language/Dockerfile/PrettyPrint.hs
+++ b/src/Language/Dockerfile/PrettyPrint.hs
@@ -73,9 +73,12 @@
       Workdir w -> do
           text "WORKDIR"
           text w
-      Expose ps -> do
+      Expose (Ports ps) -> do
           text "EXPOSE"
           hsep (map (text . show) ps)
+      Expose (PortStr p) -> do
+          text "EXPOSE"
+          text p
       Volume dir -> do
           text "VOLUME"
           text dir
diff --git a/src/Language/Dockerfile/Rules.hs b/src/Language/Dockerfile/Rules.hs
--- a/src/Language/Dockerfile/Rules.hs
+++ b/src/Language/Dockerfile/Rules.hs
@@ -229,7 +229,7 @@
     where code = "DL3011"
           severity = ErrorC
           message = "Valid UNIX ports range from 0 to 65535"
-          check (Expose ports) = and [p <= 65535 | p <- ports]
+          check (Expose (Ports ports)) = and [p <= 65535 | p <- ports]
           check _ = True
 
 maintainerAddress = instructionRule code severity message check
diff --git a/src/Language/Dockerfile/Syntax.hs b/src/Language/Dockerfile/Syntax.hs
--- a/src/Language/Dockerfile/Syntax.hs
+++ b/src/Language/Dockerfile/Syntax.hs
@@ -1,10 +1,27 @@
 module Language.Dockerfile.Syntax where
 
 import           Data.ByteString.Char8 (ByteString)
+import           Data.Maybe
+import           Data.String
+import           Text.Read
 
 type Image = String
 type Tag = String
-type Port = Integer
+
+data Ports = Ports [Integer]
+           | PortStr String
+  deriving(Show, Eq, Ord)
+
+instance IsString Ports where
+    fromString p = case readMaybe p of
+        Just i -> Ports [i]
+        Nothing ->
+            let rs = map readMaybe (words p)
+            in if all isJust rs
+            then Ports (catMaybes rs)
+            else PortStr p
+
+
 type Directory = String
 
 data BaseImage
@@ -31,7 +48,7 @@
   | Run Arguments
   | Cmd Arguments
   | Workdir Directory
-  | Expose [Port]
+  | Expose Ports
   | Volume String
   | Entrypoint Arguments
   | Maintainer String
diff --git a/src/Language/Dockerfile/Syntax/Lift.hs b/src/Language/Dockerfile/Syntax/Lift.hs
--- a/src/Language/Dockerfile/Syntax/Lift.hs
+++ b/src/Language/Dockerfile/Syntax/Lift.hs
@@ -8,6 +8,7 @@
 
 import           Language.Dockerfile.Syntax
 
+deriveLift ''Ports
 deriveLift ''BaseImage
 deriveLift ''Instruction
 deriveLift ''InstructionPos
diff --git a/test/Language/Dockerfile/EDSL/QuasiSpec.hs b/test/Language/Dockerfile/EDSL/QuasiSpec.hs
--- a/test/Language/Dockerfile/EDSL/QuasiSpec.hs
+++ b/test/Language/Dockerfile/EDSL/QuasiSpec.hs
@@ -26,14 +26,14 @@
         it "lets us use parsed dockerfiles seamlessly in our DSL" $ do
             let d = do
                     from "node"
-                    expose [8080]
+                    expose "8080"
                     [edockerfile|
                                 RUN apt-get update
                                 CMD node something.js
                                 |]
                 df = map instruction (toDockerfile d)
             df `shouldBe` [ From (UntaggedImage "node")
-                          , Expose [8080]
+                          , Expose (Ports [8080])
                           , Run ["apt-get", "update"]
                           , Cmd ["node", "something.js"]
                           ]
diff --git a/test/Language/Dockerfile/ExamplesSpec.hs b/test/Language/Dockerfile/ExamplesSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Language/Dockerfile/ExamplesSpec.hs
@@ -0,0 +1,20 @@
+module Language.Dockerfile.ExamplesSpec where
+
+import           Control.Monad
+import           Data.Monoid
+import           System.Directory
+import           System.FilePath
+import           System.FilePath.Glob
+import           System.Process
+import           Test.Hspec
+
+stackRunGhc e = callProcess "stack" ["runghc", e]
+
+spec :: Spec
+spec = do
+    cwd <- runIO getCurrentDirectory
+    exampleSources <- runIO $ glob "./examples/*.hs"
+    forM_ exampleSources $ \exampleSource -> do
+        let exampleSource' = makeRelative cwd exampleSource
+        describe exampleSource $ it ("stack runghc " <> exampleSource') $
+            stackRunGhc exampleSource
diff --git a/test/Language/Dockerfile/ParserSpec.hs b/test/Language/Dockerfile/ParserSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Language/Dockerfile/ParserSpec.hs
@@ -0,0 +1,14 @@
+module Language.Dockerfile.ParserSpec
+  where
+
+import           Language.Dockerfile.Parser
+import           Language.Dockerfile.Syntax
+import           Test.Hspec
+import           Text.Parsec
+
+spec :: Spec
+spec =
+    describe "expose" $ do
+        it "should handle number ports" $ do
+            let content = "EXPOSE 8080"
+            parse expose "" content `shouldBe` Right (Expose (Ports [8080]))
