diff --git a/hadolint.cabal b/hadolint.cabal
--- a/hadolint.cabal
+++ b/hadolint.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.0
 name:               hadolint
-version:            2.15.0
+version:            2.15.1
 synopsis:           Dockerfile Linter JavaScript API
 description:
   A smarter Dockerfile linter that helps you build best practice Docker images.
@@ -14,6 +14,8 @@
 license-file:       LICENSE
 build-type:         Simple
 extra-source-files: README.md
+
+tested-with: GHC == 9.10.3
 
 source-repository head
   type:     git
diff --git a/src/Hadolint/Rule/DL3066.hs b/src/Hadolint/Rule/DL3066.hs
--- a/src/Hadolint/Rule/DL3066.hs
+++ b/src/Hadolint/Rule/DL3066.hs
@@ -1,19 +1,31 @@
 module Hadolint.Rule.DL3066 (rule) where
 
 import qualified Data.Char as Char
+import qualified Data.Set as Set
 import qualified Data.Text as Text
 import Hadolint.Rule
 import Language.Docker.Syntax
 
+
+data Acc
+  = Acc { args :: Set.Set Text.Text }
+  | Empty
+  deriving (Show)
+
+
 rule :: Rule args
-rule = simpleRule code severity message check
+rule = customRule check (emptyState Empty)
   where
     code = "DL3066"
     severity = DLInfoC
     message = "Non-numeric user-id may not be resolvable by host system"
 
-    check (User u) = Text.all Char.isDigit $ getUid u
-    check _ = True
+    check line st (User u)
+      | Text.all Char.isDigit $ getUid u = st
+      | uidIsDefinedArg (state st) u = st
+      | otherwise = st |> addFail CheckFailure {..}
+    check _ st (Arg arg _) = st |> modify (registerArg arg)
+    check _ st _ = st
 {-# INLINEABLE rule #-}
 
 getUid :: Text.Text -> Text.Text
@@ -23,3 +35,19 @@
   where
     u [] = ""
     u (h:_) = h
+
+uidIsDefinedArg :: Acc -> Text.Text -> Bool
+uidIsDefinedArg Empty _ = False
+uidIsDefinedArg (Acc args) u = any (`varInUid` u) args
+  where
+    varInUid :: Text.Text -> Text.Text -> Bool
+    varInUid var uid =
+      ( Text.pack "${" <> var <> Text.pack "}" ) `Text.isInfixOf` uid
+        || ( Text.pack "$" <> var ) `Text.isInfixOf` uid
+
+registerArg :: Text.Text -> Acc -> Acc
+registerArg arg Empty =
+  Acc { args = Set.singleton arg }
+registerArg arg (Acc args) =
+  Acc { args = Set.insert arg args }
+
diff --git a/test/Hadolint/Rule/DL3066Spec.hs b/test/Hadolint/Rule/DL3066Spec.hs
--- a/test/Hadolint/Rule/DL3066Spec.hs
+++ b/test/Hadolint/Rule/DL3066Spec.hs
@@ -1,6 +1,7 @@
 module Hadolint.Rule.DL3066Spec (spec) where
 
 import Data.Default
+import qualified Data.Text as Text
 import Helpers
 import Test.Hspec
 
@@ -23,3 +24,7 @@
 
     it "not ok: non-numeric UID and GID" $ do
       ruleCatches rule "USER foobar:barfoo"
+
+    it "ok: UID is non-numeric, but is a defined ARG" $ do
+      let dockerfile = Text.unlines [ "ARG APP_UID", "FROM foobar:barfoo", "USER ${APP_UID}" ]
+       in ruleCatchesNot rule dockerfile
