language-docker 14.0.1 → 15.0.0
raw patch · 8 files changed
+179/−71 lines, 8 filesnew-uploaderPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Language.Docker: [$sel:alias:BaseImage] :: BaseImage -> !Maybe ImageAlias
- Language.Docker: [$sel:checkCommand:CheckArgs] :: CheckArgs args -> !Arguments args
- Language.Docker: [$sel:digest:BaseImage] :: BaseImage -> !Maybe Digest
- Language.Docker: [$sel:image:BaseImage] :: BaseImage -> !Image
- Language.Docker: [$sel:imageName:Image] :: Image -> !Text
- Language.Docker: [$sel:instruction:InstructionPos] :: InstructionPos args -> !Instruction args
- Language.Docker: [$sel:interval:CheckArgs] :: CheckArgs args -> !Maybe Duration
- Language.Docker: [$sel:lineNumber:InstructionPos] :: InstructionPos args -> !Linenumber
- Language.Docker: [$sel:platform:BaseImage] :: BaseImage -> !Maybe Platform
- Language.Docker: [$sel:registryName:Image] :: Image -> !Maybe Registry
- Language.Docker: [$sel:retries:CheckArgs] :: CheckArgs args -> !Maybe Retries
- Language.Docker: [$sel:sourcePaths:AddArgs] :: AddArgs -> NonEmpty SourcePath
- Language.Docker: [$sel:sourcePaths:CopyArgs] :: CopyArgs -> NonEmpty SourcePath
- Language.Docker: [$sel:sourcename:InstructionPos] :: InstructionPos args -> !Filename
- Language.Docker: [$sel:startInterval:CheckArgs] :: CheckArgs args -> !Maybe Duration
- Language.Docker: [$sel:startPeriod:CheckArgs] :: CheckArgs args -> !Maybe Duration
- Language.Docker: [$sel:tag:BaseImage] :: BaseImage -> !Maybe Tag
- Language.Docker: [$sel:targetPath:AddArgs] :: AddArgs -> !TargetPath
- Language.Docker: [$sel:targetPath:CopyArgs] :: CopyArgs -> !TargetPath
- Language.Docker: [$sel:timeout:CheckArgs] :: CheckArgs args -> !Maybe Duration
- Language.Docker: [$sel:unDigest:Digest] :: Digest -> Text
- Language.Docker: [$sel:unImageAlias:ImageAlias] :: ImageAlias -> Text
- Language.Docker: [$sel:unRegistry:Registry] :: Registry -> Text
- Language.Docker: [$sel:unSourcePath:SourcePath] :: SourcePath -> Text
- Language.Docker: [$sel:unTag:Tag] :: Tag -> Text
- Language.Docker: [$sel:unTargetPath:TargetPath] :: TargetPath -> Text
- Language.Docker.PrettyPrint: [$sel:buffer:EscapeAccum] :: EscapeAccum -> !Builder
- Language.Docker.PrettyPrint: [$sel:count:EscapeAccum] :: EscapeAccum -> !Int
- Language.Docker.PrettyPrint: [$sel:escaping:EscapeAccum] :: EscapeAccum -> !Bool
- Language.Docker.Syntax: [$sel:alias:BaseImage] :: BaseImage -> !Maybe ImageAlias
- Language.Docker.Syntax: [$sel:bFromImage:BindOpts] :: BindOpts -> !Maybe Text
- Language.Docker.Syntax: [$sel:bReadOnly:BindOpts] :: BindOpts -> !Maybe Bool
- Language.Docker.Syntax: [$sel:bSource:BindOpts] :: BindOpts -> !Maybe SourcePath
- Language.Docker.Syntax: [$sel:bTarget:BindOpts] :: BindOpts -> !TargetPath
- Language.Docker.Syntax: [$sel:cCacheId:CacheOpts] :: CacheOpts -> !Maybe Text
- Language.Docker.Syntax: [$sel:cFromImage:CacheOpts] :: CacheOpts -> !Maybe Text
- Language.Docker.Syntax: [$sel:cGid:CacheOpts] :: CacheOpts -> !Maybe Text
- Language.Docker.Syntax: [$sel:cMode:CacheOpts] :: CacheOpts -> !Maybe Text
- Language.Docker.Syntax: [$sel:cReadOnly:CacheOpts] :: CacheOpts -> !Maybe Bool
- Language.Docker.Syntax: [$sel:cSharing:CacheOpts] :: CacheOpts -> !Maybe CacheSharing
- Language.Docker.Syntax: [$sel:cSource:CacheOpts] :: CacheOpts -> !Maybe SourcePath
- Language.Docker.Syntax: [$sel:cTarget:CacheOpts] :: CacheOpts -> !TargetPath
- Language.Docker.Syntax: [$sel:cUid:CacheOpts] :: CacheOpts -> !Maybe Text
- Language.Docker.Syntax: [$sel:checkCommand:CheckArgs] :: CheckArgs args -> !Arguments args
- Language.Docker.Syntax: [$sel:checksumFlag:AddFlags] :: AddFlags -> !Checksum
- Language.Docker.Syntax: [$sel:chmodFlag:AddFlags] :: AddFlags -> !Chmod
- Language.Docker.Syntax: [$sel:chmodFlag:CopyFlags] :: CopyFlags -> !Chmod
- Language.Docker.Syntax: [$sel:chownFlag:AddFlags] :: AddFlags -> !Chown
- Language.Docker.Syntax: [$sel:chownFlag:CopyFlags] :: CopyFlags -> !Chown
- Language.Docker.Syntax: [$sel:digest:BaseImage] :: BaseImage -> !Maybe Digest
- Language.Docker.Syntax: [$sel:durationTime:Duration] :: Duration -> DiffTime
- Language.Docker.Syntax: [$sel:escape:EscapeChar] :: EscapeChar -> Char
- Language.Docker.Syntax: [$sel:excludeFlags:AddFlags] :: AddFlags -> ![Exclude]
- Language.Docker.Syntax: [$sel:excludeFlags:CopyFlags] :: CopyFlags -> ![Exclude]
- Language.Docker.Syntax: [$sel:image:BaseImage] :: BaseImage -> !Image
- Language.Docker.Syntax: [$sel:imageName:Image] :: Image -> !Text
- Language.Docker.Syntax: [$sel:instruction:InstructionPos] :: InstructionPos args -> !Instruction args
- Language.Docker.Syntax: [$sel:interval:CheckArgs] :: CheckArgs args -> !Maybe Duration
- Language.Docker.Syntax: [$sel:lineNumber:InstructionPos] :: InstructionPos args -> !Linenumber
- Language.Docker.Syntax: [$sel:linkFlag:AddFlags] :: AddFlags -> !Link
- Language.Docker.Syntax: [$sel:linkFlag:CopyFlags] :: CopyFlags -> !Link
- Language.Docker.Syntax: [$sel:mount:RunFlags] :: RunFlags -> !Set RunMount
- Language.Docker.Syntax: [$sel:network:RunFlags] :: RunFlags -> !Maybe RunNetwork
- Language.Docker.Syntax: [$sel:platform:BaseImage] :: BaseImage -> !Maybe Platform
- Language.Docker.Syntax: [$sel:registryName:Image] :: Image -> !Maybe Registry
- Language.Docker.Syntax: [$sel:retries:CheckArgs] :: CheckArgs args -> !Maybe Retries
- Language.Docker.Syntax: [$sel:sCacheId:SecretOpts] :: SecretOpts -> !Maybe Text
- Language.Docker.Syntax: [$sel:sEnv:SecretOpts] :: SecretOpts -> !Maybe Text
- Language.Docker.Syntax: [$sel:sGid:SecretOpts] :: SecretOpts -> !Maybe Text
- Language.Docker.Syntax: [$sel:sIsRequired:SecretOpts] :: SecretOpts -> !Maybe Bool
- Language.Docker.Syntax: [$sel:sMode:SecretOpts] :: SecretOpts -> !Maybe Text
- Language.Docker.Syntax: [$sel:sSource:SecretOpts] :: SecretOpts -> !Maybe SourcePath
- Language.Docker.Syntax: [$sel:sTarget:SecretOpts] :: SecretOpts -> !Maybe TargetPath
- Language.Docker.Syntax: [$sel:sUid:SecretOpts] :: SecretOpts -> !Maybe Text
- Language.Docker.Syntax: [$sel:security:RunFlags] :: RunFlags -> !Maybe RunSecurity
- Language.Docker.Syntax: [$sel:sourceFlag:CopyFlags] :: CopyFlags -> !CopySource
- Language.Docker.Syntax: [$sel:sourcePaths:AddArgs] :: AddArgs -> NonEmpty SourcePath
- Language.Docker.Syntax: [$sel:sourcePaths:CopyArgs] :: CopyArgs -> NonEmpty SourcePath
- Language.Docker.Syntax: [$sel:sourcename:InstructionPos] :: InstructionPos args -> !Filename
- Language.Docker.Syntax: [$sel:startInterval:CheckArgs] :: CheckArgs args -> !Maybe Duration
- Language.Docker.Syntax: [$sel:startPeriod:CheckArgs] :: CheckArgs args -> !Maybe Duration
- Language.Docker.Syntax: [$sel:syntax:SyntaxImage] :: SyntaxImage -> Image
- Language.Docker.Syntax: [$sel:tTarget:TmpOpts] :: TmpOpts -> TargetPath
- Language.Docker.Syntax: [$sel:tag:BaseImage] :: BaseImage -> !Maybe Tag
- Language.Docker.Syntax: [$sel:targetPath:AddArgs] :: AddArgs -> !TargetPath
- Language.Docker.Syntax: [$sel:targetPath:CopyArgs] :: CopyArgs -> !TargetPath
- Language.Docker.Syntax: [$sel:timeout:CheckArgs] :: CheckArgs args -> !Maybe Duration
- Language.Docker.Syntax: [$sel:times:Retries] :: Retries -> Int
- Language.Docker.Syntax: [$sel:unDigest:Digest] :: Digest -> Text
- Language.Docker.Syntax: [$sel:unExclude:Exclude] :: Exclude -> Text
- Language.Docker.Syntax: [$sel:unImageAlias:ImageAlias] :: ImageAlias -> Text
- Language.Docker.Syntax: [$sel:unPorts:Ports] :: Ports -> [PortSpec]
- Language.Docker.Syntax: [$sel:unRegistry:Registry] :: Registry -> Text
- Language.Docker.Syntax: [$sel:unSourcePath:SourcePath] :: SourcePath -> Text
- Language.Docker.Syntax: [$sel:unTag:Tag] :: Tag -> Text
- Language.Docker.Syntax: [$sel:unTargetPath:TargetPath] :: TargetPath -> Text
- Language.Docker.Syntax: instance Data.String.IsString (Language.Docker.Syntax.Arguments Data.Text.Internal.Text)
- Language.Docker.Syntax: instance Data.String.IsString (Language.Docker.Syntax.RunArgs Data.Text.Internal.Text)
- Language.Docker.Syntax: instance Data.String.IsString Language.Docker.Syntax.Checksum
- Language.Docker.Syntax: instance Data.String.IsString Language.Docker.Syntax.Chmod
- Language.Docker.Syntax: instance Data.String.IsString Language.Docker.Syntax.Chown
- Language.Docker.Syntax: instance Data.String.IsString Language.Docker.Syntax.CopySource
- Language.Docker.Syntax: instance Data.String.IsString Language.Docker.Syntax.Digest
- Language.Docker.Syntax: instance Data.String.IsString Language.Docker.Syntax.Exclude
- Language.Docker.Syntax: instance Data.String.IsString Language.Docker.Syntax.Image
- Language.Docker.Syntax: instance Data.String.IsString Language.Docker.Syntax.ImageAlias
- Language.Docker.Syntax: instance Data.String.IsString Language.Docker.Syntax.Registry
- Language.Docker.Syntax: instance Data.String.IsString Language.Docker.Syntax.SourcePath
- Language.Docker.Syntax: instance Data.String.IsString Language.Docker.Syntax.Tag
- Language.Docker.Syntax: instance Data.String.IsString Language.Docker.Syntax.TargetPath
- Language.Docker.Syntax: instance GHC.Base.Functor Language.Docker.Syntax.Arguments
- Language.Docker.Syntax: instance GHC.Base.Functor Language.Docker.Syntax.Check
- Language.Docker.Syntax: instance GHC.Base.Functor Language.Docker.Syntax.CheckArgs
- Language.Docker.Syntax: instance GHC.Base.Functor Language.Docker.Syntax.Instruction
- Language.Docker.Syntax: instance GHC.Base.Functor Language.Docker.Syntax.InstructionPos
- Language.Docker.Syntax: instance GHC.Base.Functor Language.Docker.Syntax.RunArgs
- Language.Docker.Syntax: instance GHC.IsList.IsList (Language.Docker.Syntax.Arguments Data.Text.Internal.Text)
- Language.Docker.Syntax: instance GHC.IsList.IsList Language.Docker.Syntax.Ports
- Language.Docker.Syntax: instance GHC.Num.Num Language.Docker.Syntax.Duration
- Language.Docker.Syntax: instance GHC.Num.Num Language.Docker.Syntax.Retries
- Language.Docker.Syntax: instance GHC.Real.Fractional Language.Docker.Syntax.Duration
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.AddArgs
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.AddFlags
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.BaseImage
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.BindOpts
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.CacheOpts
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.CacheSharing
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.Checksum
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.Chmod
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.Chown
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.CopyArgs
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.CopyFlags
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.CopySource
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.Digest
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.Duration
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.EscapeChar
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.Exclude
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.Image
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.ImageAlias
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.Link
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.PortSpec
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.Ports
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.PragmaDirective
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.Registry
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.Retries
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.RunFlags
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.RunMount
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.RunNetwork
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.RunSecurity
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.SecretOpts
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.SourcePath
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.SyntaxImage
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.Tag
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.TargetPath
- Language.Docker.Syntax: instance GHC.Show.Show Language.Docker.Syntax.TmpOpts
- Language.Docker.Syntax: instance GHC.Show.Show args => GHC.Show.Show (Language.Docker.Syntax.Arguments args)
- Language.Docker.Syntax: instance GHC.Show.Show args => GHC.Show.Show (Language.Docker.Syntax.Check args)
- Language.Docker.Syntax: instance GHC.Show.Show args => GHC.Show.Show (Language.Docker.Syntax.CheckArgs args)
- Language.Docker.Syntax: instance GHC.Show.Show args => GHC.Show.Show (Language.Docker.Syntax.Instruction args)
- Language.Docker.Syntax: instance GHC.Show.Show args => GHC.Show.Show (Language.Docker.Syntax.InstructionPos args)
- Language.Docker.Syntax: instance GHC.Show.Show args => GHC.Show.Show (Language.Docker.Syntax.RunArgs args)
+ Language.Docker: [alias] :: BaseImage -> !Maybe ImageAlias
+ Language.Docker: [checkCommand] :: CheckArgs args -> !Arguments args
+ Language.Docker: [digest] :: BaseImage -> !Maybe Digest
+ Language.Docker: [imageName] :: Image -> !Text
+ Language.Docker: [image] :: BaseImage -> !Image
+ Language.Docker: [instruction] :: InstructionPos args -> !Instruction args
+ Language.Docker: [interval] :: CheckArgs args -> !Maybe Duration
+ Language.Docker: [lineNumber] :: InstructionPos args -> !Linenumber
+ Language.Docker: [platform] :: BaseImage -> !Maybe Platform
+ Language.Docker: [registryName] :: Image -> !Maybe Registry
+ Language.Docker: [retries] :: CheckArgs args -> !Maybe Retries
+ Language.Docker: [sourcePaths] :: AddArgs -> NonEmpty SourcePath
+ Language.Docker: [sourcename] :: InstructionPos args -> !Filename
+ Language.Docker: [startInterval] :: CheckArgs args -> !Maybe Duration
+ Language.Docker: [startPeriod] :: CheckArgs args -> !Maybe Duration
+ Language.Docker: [tag] :: BaseImage -> !Maybe Tag
+ Language.Docker: [targetPath] :: AddArgs -> !TargetPath
+ Language.Docker: [timeout] :: CheckArgs args -> !Maybe Duration
+ Language.Docker: [unDigest] :: Digest -> Text
+ Language.Docker: [unImageAlias] :: ImageAlias -> Text
+ Language.Docker: [unRegistry] :: Registry -> Text
+ Language.Docker: [unSourcePath] :: SourcePath -> Text
+ Language.Docker: [unTag] :: Tag -> Text
+ Language.Docker: [unTargetPath] :: TargetPath -> Text
+ Language.Docker.PrettyPrint: [buffer] :: EscapeAccum -> !Builder
+ Language.Docker.PrettyPrint: [count] :: EscapeAccum -> !Int
+ Language.Docker.PrettyPrint: [escaping] :: EscapeAccum -> !Bool
+ Language.Docker.Syntax: RelabelPrivate :: Relabel
+ Language.Docker.Syntax: RelabelShared :: Relabel
+ Language.Docker.Syntax: [alias] :: BaseImage -> !Maybe ImageAlias
+ Language.Docker.Syntax: [bFromImage] :: BindOpts -> !Maybe Text
+ Language.Docker.Syntax: [bReadOnly] :: BindOpts -> !Maybe Bool
+ Language.Docker.Syntax: [bRelabel] :: BindOpts -> !Maybe Relabel
+ Language.Docker.Syntax: [bSource] :: BindOpts -> !Maybe SourcePath
+ Language.Docker.Syntax: [bTarget] :: BindOpts -> !TargetPath
+ Language.Docker.Syntax: [cCacheId] :: CacheOpts -> !Maybe Text
+ Language.Docker.Syntax: [cFromImage] :: CacheOpts -> !Maybe Text
+ Language.Docker.Syntax: [cGid] :: CacheOpts -> !Maybe Text
+ Language.Docker.Syntax: [cMode] :: CacheOpts -> !Maybe Text
+ Language.Docker.Syntax: [cReadOnly] :: CacheOpts -> !Maybe Bool
+ Language.Docker.Syntax: [cSharing] :: CacheOpts -> !Maybe CacheSharing
+ Language.Docker.Syntax: [cSource] :: CacheOpts -> !Maybe SourcePath
+ Language.Docker.Syntax: [cTarget] :: CacheOpts -> !TargetPath
+ Language.Docker.Syntax: [cUid] :: CacheOpts -> !Maybe Text
+ Language.Docker.Syntax: [checkCommand] :: CheckArgs args -> !Arguments args
+ Language.Docker.Syntax: [checksumFlag] :: AddFlags -> !Checksum
+ Language.Docker.Syntax: [chmodFlag] :: AddFlags -> !Chmod
+ Language.Docker.Syntax: [chownFlag] :: AddFlags -> !Chown
+ Language.Docker.Syntax: [digest] :: BaseImage -> !Maybe Digest
+ Language.Docker.Syntax: [durationTime] :: Duration -> DiffTime
+ Language.Docker.Syntax: [escape] :: EscapeChar -> Char
+ Language.Docker.Syntax: [excludeFlags] :: AddFlags -> ![Exclude]
+ Language.Docker.Syntax: [imageName] :: Image -> !Text
+ Language.Docker.Syntax: [image] :: BaseImage -> !Image
+ Language.Docker.Syntax: [instruction] :: InstructionPos args -> !Instruction args
+ Language.Docker.Syntax: [interval] :: CheckArgs args -> !Maybe Duration
+ Language.Docker.Syntax: [lineNumber] :: InstructionPos args -> !Linenumber
+ Language.Docker.Syntax: [linkFlag] :: AddFlags -> !Link
+ Language.Docker.Syntax: [mount] :: RunFlags -> !Set RunMount
+ Language.Docker.Syntax: [network] :: RunFlags -> !Maybe RunNetwork
+ Language.Docker.Syntax: [platform] :: BaseImage -> !Maybe Platform
+ Language.Docker.Syntax: [registryName] :: Image -> !Maybe Registry
+ Language.Docker.Syntax: [retries] :: CheckArgs args -> !Maybe Retries
+ Language.Docker.Syntax: [sCacheId] :: SecretOpts -> !Maybe Text
+ Language.Docker.Syntax: [sEnv] :: SecretOpts -> !Maybe Text
+ Language.Docker.Syntax: [sGid] :: SecretOpts -> !Maybe Text
+ Language.Docker.Syntax: [sIsRequired] :: SecretOpts -> !Maybe Bool
+ Language.Docker.Syntax: [sMode] :: SecretOpts -> !Maybe Text
+ Language.Docker.Syntax: [sSource] :: SecretOpts -> !Maybe SourcePath
+ Language.Docker.Syntax: [sTarget] :: SecretOpts -> !Maybe TargetPath
+ Language.Docker.Syntax: [sUid] :: SecretOpts -> !Maybe Text
+ Language.Docker.Syntax: [security] :: RunFlags -> !Maybe RunSecurity
+ Language.Docker.Syntax: [sourceFlag] :: CopyFlags -> !CopySource
+ Language.Docker.Syntax: [sourcePaths] :: AddArgs -> NonEmpty SourcePath
+ Language.Docker.Syntax: [sourcename] :: InstructionPos args -> !Filename
+ Language.Docker.Syntax: [startInterval] :: CheckArgs args -> !Maybe Duration
+ Language.Docker.Syntax: [startPeriod] :: CheckArgs args -> !Maybe Duration
+ Language.Docker.Syntax: [syntax] :: SyntaxImage -> Image
+ Language.Docker.Syntax: [tTarget] :: TmpOpts -> TargetPath
+ Language.Docker.Syntax: [tag] :: BaseImage -> !Maybe Tag
+ Language.Docker.Syntax: [targetPath] :: AddArgs -> !TargetPath
+ Language.Docker.Syntax: [timeout] :: CheckArgs args -> !Maybe Duration
+ Language.Docker.Syntax: [times] :: Retries -> Int
+ Language.Docker.Syntax: [unDigest] :: Digest -> Text
+ Language.Docker.Syntax: [unExclude] :: Exclude -> Text
+ Language.Docker.Syntax: [unImageAlias] :: ImageAlias -> Text
+ Language.Docker.Syntax: [unPorts] :: Ports -> [PortSpec]
+ Language.Docker.Syntax: [unRegistry] :: Registry -> Text
+ Language.Docker.Syntax: [unSourcePath] :: SourcePath -> Text
+ Language.Docker.Syntax: [unTag] :: Tag -> Text
+ Language.Docker.Syntax: [unTargetPath] :: TargetPath -> Text
+ Language.Docker.Syntax: data Relabel
+ Language.Docker.Syntax: instance GHC.Classes.Eq Language.Docker.Syntax.Relabel
+ Language.Docker.Syntax: instance GHC.Classes.Ord Language.Docker.Syntax.Relabel
+ Language.Docker.Syntax: instance GHC.Internal.Base.Functor Language.Docker.Syntax.Arguments
+ Language.Docker.Syntax: instance GHC.Internal.Base.Functor Language.Docker.Syntax.Check
+ Language.Docker.Syntax: instance GHC.Internal.Base.Functor Language.Docker.Syntax.CheckArgs
+ Language.Docker.Syntax: instance GHC.Internal.Base.Functor Language.Docker.Syntax.Instruction
+ Language.Docker.Syntax: instance GHC.Internal.Base.Functor Language.Docker.Syntax.InstructionPos
+ Language.Docker.Syntax: instance GHC.Internal.Base.Functor Language.Docker.Syntax.RunArgs
+ Language.Docker.Syntax: instance GHC.Internal.Data.String.IsString (Language.Docker.Syntax.Arguments Data.Text.Internal.Text)
+ Language.Docker.Syntax: instance GHC.Internal.Data.String.IsString (Language.Docker.Syntax.RunArgs Data.Text.Internal.Text)
+ Language.Docker.Syntax: instance GHC.Internal.Data.String.IsString Language.Docker.Syntax.Checksum
+ Language.Docker.Syntax: instance GHC.Internal.Data.String.IsString Language.Docker.Syntax.Chmod
+ Language.Docker.Syntax: instance GHC.Internal.Data.String.IsString Language.Docker.Syntax.Chown
+ Language.Docker.Syntax: instance GHC.Internal.Data.String.IsString Language.Docker.Syntax.CopySource
+ Language.Docker.Syntax: instance GHC.Internal.Data.String.IsString Language.Docker.Syntax.Digest
+ Language.Docker.Syntax: instance GHC.Internal.Data.String.IsString Language.Docker.Syntax.Exclude
+ Language.Docker.Syntax: instance GHC.Internal.Data.String.IsString Language.Docker.Syntax.Image
+ Language.Docker.Syntax: instance GHC.Internal.Data.String.IsString Language.Docker.Syntax.ImageAlias
+ Language.Docker.Syntax: instance GHC.Internal.Data.String.IsString Language.Docker.Syntax.Registry
+ Language.Docker.Syntax: instance GHC.Internal.Data.String.IsString Language.Docker.Syntax.SourcePath
+ Language.Docker.Syntax: instance GHC.Internal.Data.String.IsString Language.Docker.Syntax.Tag
+ Language.Docker.Syntax: instance GHC.Internal.Data.String.IsString Language.Docker.Syntax.TargetPath
+ Language.Docker.Syntax: instance GHC.Internal.IsList.IsList (Language.Docker.Syntax.Arguments Data.Text.Internal.Text)
+ Language.Docker.Syntax: instance GHC.Internal.IsList.IsList Language.Docker.Syntax.Ports
+ Language.Docker.Syntax: instance GHC.Internal.Num.Num Language.Docker.Syntax.Duration
+ Language.Docker.Syntax: instance GHC.Internal.Num.Num Language.Docker.Syntax.Retries
+ Language.Docker.Syntax: instance GHC.Internal.Real.Fractional Language.Docker.Syntax.Duration
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.AddArgs
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.AddFlags
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.BaseImage
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.BindOpts
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.CacheOpts
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.CacheSharing
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.Checksum
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.Chmod
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.Chown
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.CopyArgs
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.CopyFlags
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.CopySource
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.Digest
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.Duration
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.EscapeChar
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.Exclude
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.Image
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.ImageAlias
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.Link
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.PortSpec
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.Ports
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.PragmaDirective
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.Registry
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.Relabel
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.Retries
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.RunFlags
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.RunMount
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.RunNetwork
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.RunSecurity
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.SecretOpts
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.SourcePath
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.SyntaxImage
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.Tag
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.TargetPath
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show Language.Docker.Syntax.TmpOpts
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show args => GHC.Internal.Show.Show (Language.Docker.Syntax.Arguments args)
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show args => GHC.Internal.Show.Show (Language.Docker.Syntax.Check args)
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show args => GHC.Internal.Show.Show (Language.Docker.Syntax.CheckArgs args)
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show args => GHC.Internal.Show.Show (Language.Docker.Syntax.Instruction args)
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show args => GHC.Internal.Show.Show (Language.Docker.Syntax.InstructionPos args)
+ Language.Docker.Syntax: instance GHC.Internal.Show.Show args => GHC.Internal.Show.Show (Language.Docker.Syntax.RunArgs args)
- Language.Docker.Syntax: BindOpts :: !TargetPath -> !Maybe SourcePath -> !Maybe Text -> !Maybe Bool -> BindOpts
+ Language.Docker.Syntax: BindOpts :: !TargetPath -> !Maybe SourcePath -> !Maybe Text -> !Maybe Bool -> !Maybe Relabel -> BindOpts
Files
- README.md +3/−3
- language-docker.cabal +1/−1
- src/Language/Docker/Parser/Run.hs +65/−59
- src/Language/Docker/PrettyPrint.hs +5/−0
- src/Language/Docker/Syntax.hs +8/−2
- test/Language/Docker/ParseExposeSpec.hs +0/−2
- test/Language/Docker/ParseHealthcheckSpec.hs +0/−2
- test/Language/Docker/ParseRunSpec.hs +97/−2
README.md view
@@ -1,4 +1,4 @@-[![Build Status][travis-img]][travis]+[![Build Status][actions-img]][actions] [![Hackage][hackage-img]][hackage] [![GPL-3 licensed][license-img]][license] @@ -37,7 +37,7 @@ [hackage-img]: https://img.shields.io/hackage/v/language-docker.svg [hackage]: https://hackage.haskell.org/package/language-docker-[travis-img]: https://travis-ci.org/hadolint/language-docker.svg?branch=master-[travis]: https://travis-ci.org/hadolint/language-docker+[actions-img]: https://github.com/hadolint/language-docker/actions/workflows/haskell.yml/badge.svg+[actions]: https://github.com/hadolint/language-docker/actions/workflows/haskell.yml [license-img]: https://img.shields.io/badge/license-GPL--3-blue.svg [license]: https://tldrlegal.com/license/gnu-general-public-license-v3-(gpl-3)
language-docker.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.4 name: language-docker-version: 14.0.1+version: 15.0.0 synopsis: Dockerfile parser, pretty-printer and embedded DSL description: All functions for parsing and pretty-printing Dockerfiles are exported through @Language.Docker@. For more fine-grained operations look for specific modules that implement a certain functionality.
src/Language/Docker/Parser/Run.hs view
@@ -28,9 +28,10 @@ | MountArgSharing CacheSharing | MountArgSource SourcePath | MountArgTarget TargetPath- | MountArgType Text+ | MountArgType MountType | MountArgUid Text | MountArgGid Text+ | MountArgRelabel Relabel deriving (Show) data MountType@@ -39,6 +40,7 @@ | Tmpfs | Secret | Ssh+ deriving (Show) parseRun :: (?esc :: Char) => Parser (Instruction Text) parseRun = do@@ -83,46 +85,44 @@ runFlagMount :: (?esc :: Char) => Parser RunMount runFlagMount = do void $ string "--mount="- maybeType <-- choice- [ string "type="- *> choice- [ Just Bind <$ string "bind",- Just Cache <$ string "cache",- Just Tmpfs <$ string "tmpfs",- Just Secret <$ string "secret",- Just Ssh <$ string "ssh"- ],- pure Nothing- ]- (mountType, args) <- return $- case maybeType of- Nothing -> (Bind, argsParser Bind)- Just Ssh -> (Ssh, choice [string "," *> argsParser Ssh, pure []])- Just t -> (t, string "," *> argsParser t)- case mountType of- Bind -> BindMount <$> (bindMount =<< args)- Cache -> CacheMount <$> (cacheMount =<< args)- Tmpfs -> TmpfsMount <$> (tmpfsMount =<< args)- Secret -> SecretMount <$> (secretMount =<< args)- Ssh -> SshMount <$> (secretMount =<< args)+ args <- mountArgs `sepBy1` string ","+ mt <- parseTypeFromArgs args+ case mt of+ Bind -> BindMount <$> bindMount (filter (not . isMountArgType) args)+ Cache -> CacheMount <$> cacheMount (filter (not . isMountArgType) args)+ Tmpfs -> TmpfsMount <$> tmpfsMount (filter (not . isMountArgType) args)+ Secret -> SecretMount <$> secretMount (filter (not . isMountArgType) args)+ Ssh -> SshMount <$> secretMount (filter (not . isMountArgType) args) -argsParser :: (?esc :: Char) => MountType -> Parser [RunMountArg]-argsParser mountType = mountChoices mountType `sepBy1` string ","+parseTypeFromArgs :: [RunMountArg] -> Parser MountType+parseTypeFromArgs args =+ -- `notFollowedBy eof` is a trivially succeeding parser that isn't supposed to+ -- consume any input here. It's a hack that converts a simple type into a+ -- parser. This allows this function to emit parse errors after analyzing its+ -- input arguments and not consume any input.+ case filter isMountArgType args of+ [] -> Bind <$ notFollowedBy eof+ [MountArgType t] -> t <$ notFollowedBy eof+ _:_ -> fail "--mount with multiple `type` arguments" +isMountArgType :: RunMountArg -> Bool+isMountArgType (MountArgType _) = True+isMountArgType _ = False+ bindMount :: [RunMountArg] -> Parser BindOpts bindMount args = case validArgs "bind" allowed required args of Left e -> customError e Right as -> return $ foldr bindOpts def as where- allowed = Set.fromList ["target", "source", "from", "ro"]+ allowed = Set.fromList ["target", "source", "from", "ro", "relabel"] required = Set.singleton "target" bindOpts :: RunMountArg -> BindOpts -> BindOpts bindOpts (MountArgTarget path) bo = bo {bTarget = path} bindOpts (MountArgSource path) bo = bo {bSource = Just path} bindOpts (MountArgFromImage img) bo = bo {bFromImage = Just img} bindOpts (MountArgReadOnly ro) bo = bo {bReadOnly = Just ro}+ bindOpts (MountArgRelabel re) bo = bo {bRelabel = Just re} bindOpts invalid _ = error $ "unhandled " <> show invalid <> " please report this bug" cacheMount :: [RunMountArg] -> Parser CacheOpts@@ -188,6 +188,7 @@ [] -> result missing -> Left $ MissingArgument missing where+ checkValidArg :: RunMountArg -> (Either DockerfileError [RunMountArg], Set.Set Text) -> (Either DockerfileError [RunMountArg], Set.Set Text) checkValidArg _ x@(Left _, _) = x checkValidArg a (Right as, seen) = let name = toArgName a@@ -196,38 +197,23 @@ (_, True) -> (Left (DuplicateArgument name), seen) (True, False) -> (Right (a : as), Set.insert name seen) -mountChoices :: (?esc :: Char) => MountType -> Parser RunMountArg-mountChoices mountType =- choice $- case mountType of- Bind ->- [ mountArgTarget,- mountArgSource,- mountArgFromImage,- mountArgReadOnly- ]- Cache ->- [ mountArgTarget,- mountArgSource,- mountArgFromImage,- mountArgReadOnly,- mountArgId,- mountArgSharing,- mountArgMode,- mountArgUid,- mountArgGid- ]- Tmpfs -> [mountArgTarget]- _ -> -- Secret and Ssh- [ mountArgTarget,- mountArgId,- mountArgRequired,- mountArgSource,- mountArgMode,- mountArgUid,- mountArgGid,- mountArgEnv- ]+mountArgs :: (?esc :: Char) => Parser RunMountArg+mountArgs =+ choice+ [ mountArgEnv,+ mountArgFromImage,+ mountArgGid,+ mountArgId,+ mountArgMode,+ mountArgReadOnly,+ mountArgRelabel,+ mountArgRequired,+ mountArgSharing,+ mountArgSource,+ mountArgTarget,+ mountArgType,+ mountArgUid+ ] stringArg :: (?esc :: Char) => Parser Text stringArg = choice [doubleQuotedString, someUnless "a string" (== ',')]@@ -319,9 +305,28 @@ label "target=" $ choice [string "target=", string "dst=", string "destination="] MountArgTarget . TargetPath <$> stringArg +mountArgType :: Parser RunMountArg+mountArgType = MountArgType <$> key "type" mountType++mountType :: Parser MountType+mountType =+ choice+ [ Bind <$ string "bind",+ Cache <$ string "cache",+ Tmpfs <$ string "tmpfs",+ Secret <$ string "secret",+ Ssh <$ string "ssh"+ ]+ mountArgUid :: (?esc :: Char) => Parser RunMountArg mountArgUid = MountArgUid <$> key "uid" stringArg +mountArgRelabel :: Parser RunMountArg+mountArgRelabel = MountArgRelabel <$> key "relabel" relabel++relabel :: Parser Relabel+relabel = choice [RelabelShared <$ string "shared", RelabelPrivate <$ string "private"]+ toArgName :: RunMountArg -> Text toArgName (MountArgEnv _) = "env" toArgName (MountArgFromImage _) = "from"@@ -335,3 +340,4 @@ toArgName (MountArgTarget _) = "target" toArgName (MountArgType _) = "type" toArgName (MountArgUid _) = "uid"+toArgName (MountArgRelabel _) = "relabel"
src/Language/Docker/PrettyPrint.hs view
@@ -188,6 +188,7 @@ <> maybe mempty printSource bSource <> maybe mempty printFromImage bFromImage <> maybe mempty printReadOnly bReadOnly+ <> maybe mempty printRelabel bRelabel CacheMount CacheOpts {..} -> "type=cache" <> printTarget cTarget@@ -237,6 +238,10 @@ printReadOnly False = ",rw" printRequired True = ",required" printRequired False = mempty+ printRelabel r = ",relabel="+ <> case r of+ RelabelShared -> printQuotable "shared"+ RelabelPrivate -> printQuotable "private" prettyPrintRunNetwork :: Maybe RunNetwork -> Doc ann prettyPrintRunNetwork Nothing = mempty
src/Language/Docker/Syntax.hs view
@@ -119,6 +119,11 @@ } deriving (Show, Eq, Ord, IsString) +data Relabel+ = RelabelShared+ | RelabelPrivate+ deriving (Show, Eq, Ord)+ data Checksum = Checksum !Text | NoChecksum@@ -271,12 +276,13 @@ { bTarget :: !TargetPath, bSource :: !(Maybe SourcePath), bFromImage :: !(Maybe Text),- bReadOnly :: !(Maybe Bool)+ bReadOnly :: !(Maybe Bool),+ bRelabel :: !(Maybe Relabel) } deriving (Show, Eq, Ord) instance Default BindOpts where- def = BindOpts "" Nothing Nothing Nothing+ def = BindOpts "" Nothing Nothing Nothing Nothing data CacheOpts = CacheOpts
test/Language/Docker/ParseExposeSpec.hs view
@@ -1,7 +1,5 @@ module Language.Docker.ParseExposeSpec where -import Data.Default.Class (def)-import qualified Data.Text as Text import Language.Docker.Syntax import TestHelper import Test.Hspec
test/Language/Docker/ParseHealthcheckSpec.hs view
@@ -1,10 +1,8 @@ module Language.Docker.ParseHealthcheckSpec where -import Data.Default.Class (def) import Language.Docker.Syntax import Test.Hspec import TestHelper-import qualified Data.Set as Set import qualified Data.Text as Text
test/Language/Docker/ParseRunSpec.hs view
@@ -50,8 +50,8 @@ [ Run $ RunArgs (ArgumentsText "echo foo") flags ] it "--mount=type=bind all modifiers" $- let file = Text.unlines ["RUN --mount=type=bind,target=/foo,source=/bar,from=ubuntu,ro echo foo"]- flags = def {mount = Set.singleton $ BindMount (BindOpts {bTarget = "/foo", bSource = Just "/bar", bFromImage = Just "ubuntu", bReadOnly = Just True})}+ let file = Text.unlines ["RUN --mount=type=bind,target=/foo,source=/bar,from=ubuntu,ro,relabel=shared echo foo"]+ flags = def {mount = Set.singleton $ BindMount (BindOpts {bTarget = "/foo", bSource = Just "/bar", bFromImage = Just "ubuntu", bReadOnly = Just True, bRelabel = Just RelabelShared})} in assertAst file [ Run $ RunArgs (ArgumentsText "echo foo") flags@@ -72,6 +72,41 @@ Run $ RunArgs (ArgumentsText "echo foo") flags2, Run $ RunArgs (ArgumentsText "echo foo") flags3 ]++ it "--mount=type=cache with id from variable/arg" $+ let file =+ Text.unlines+ [ "ARG debian_version=12",+ "FROM debian:bookworm-slim",+ "RUN --mount=id=debian:${debian_version},type=cache,target=/foo foo bar"+ ]+ flags = def {mount = Set.singleton $ CacheMount (def {cTarget = "/foo", cCacheId = Just "debian:${debian_version}"})}+ in assertAst+ file+ [ Arg "debian_version" (Just "12"),+ From $ BaseImage+ { image = Image+ { registryName = Nothing,+ imageName="debian"+ },+ tag = Just Tag { unTag="bookworm-slim" },+ digest = Nothing,+ alias = Nothing,+ platform = Nothing+ },+ Run $ RunArgs (ArgumentsText "foo bar") flags+ ]++ it "--mount=type=cache,dst=/foo" $+ let file = Text.unlines [ "RUN --mount=type=cache,dst=/foo echo foo" ]+ flags = def {mount = Set.singleton $ CacheMount (def {cTarget = "/foo"})}+ in assertAst file [ Run $ RunArgs (ArgumentsText "echo foo") flags ]++ it "--mount=dst=/foo,type=cache" $+ let file = Text.unlines [ "RUN --mount=dst=/foo,type=cache echo foo" ]+ flags = def {mount = Set.singleton $ CacheMount (def {cTarget = "/foo"})}+ in assertAst file [ Run $ RunArgs (ArgumentsText "echo foo") flags ]+ it "--mount=type=cache with all modifiers" $ let file = Text.unlines@@ -99,6 +134,33 @@ file [ Run $ RunArgs (ArgumentsText "echo foo") flags ]+ it "--mount=type=cache with all modifiers, different order" $+ let file =+ Text.unlines+ [ "RUN --mount=readonly,sharing=private,id=a,type=cache,from=ubuntu,source=/bar,destination=/foo,mode=0700,uid=0,gid=0 echo foo"+ ]+ flags =+ def+ { mount =+ Set.singleton $+ CacheMount+ ( def+ { cTarget = "/foo",+ cSharing = Just Private,+ cCacheId = Just "a",+ cReadOnly = Just True,+ cFromImage = Just "ubuntu",+ cSource = Just "/bar",+ cMode = Just "0700",+ cUid = Just "0",+ cGid = Just "0"+ }+ )+ }+ in assertAst+ file+ [ Run $ RunArgs (ArgumentsText "echo foo") flags+ ] it "--mount=type=tmpfs" $ let file = Text.unlines ["RUN --mount=type=tmpfs,target=/foo echo foo"] flags = def {mount = Set.singleton $ TmpfsMount (def {tTarget = "/foo"})}@@ -639,3 +701,36 @@ file [ Run $ RunArgs ( ArgumentsText "ls && cat" ) flags ]++ describe "Parse RUN instructions - invalid cases" $ do+ it "fail because of multiple types in --mount" $+ let line = "RUN --mount=type=cache,type=tmpfs,target=/foo foo bar"+ in expectFail line++ describe "Parse RUN instructions - SELinux relabeling" $ do+ let flagsRelabelShared =+ def { mount = Set.singleton $+ BindMount+ ( def+ { bTarget = "/bar",+ bRelabel = Just RelabelShared+ }+ )+ }+ flagsRelabelPrivate =+ def { mount = Set.singleton $+ BindMount+ ( def+ { bTarget = "/bar",+ bRelabel = Just RelabelPrivate+ }+ )+ }+ it "RUN with --relabel=shared" $+ let file = Text.unlines+ ["RUN --mount=type=bind,target=/bar,relabel=shared echo foo"]+ in assertAst file [ Run $ RunArgs (ArgumentsText "echo foo") flagsRelabelShared ]+ it "RUN with --relabel=private" $+ let file = Text.unlines+ ["RUN --mount=type=bind,target=/bar,relabel=private echo foo"]+ in assertAst file [ Run $ RunArgs (ArgumentsText "echo foo") flagsRelabelPrivate ]