@@ -231,7 +231,7 @@ runContainerAndExit getCmdArgs
231231 do config <- asks getConfig
232232 let docker = configDocker config
233233 envOverride <- getEnvOverride (configPlatform config)
234- checkDockerVersion envOverride
234+ checkDockerVersion envOverride docker
235235 (dockerHost,dockerCertPath,bamboo,jenkins) <-
236236 liftIO ((,,,) <$> lookupEnv " DOCKER_HOST"
237237 <*> lookupEnv " DOCKER_CERT_PATH"
@@ -366,8 +366,9 @@ cleanup :: M env m
366366 => CleanupOpts -> m ()
367367cleanup opts =
368368 do config <- asks getConfig
369+ let docker = configDocker config
369370 envOverride <- getEnvOverride (configPlatform config)
370- checkDockerVersion envOverride
371+ checkDockerVersion envOverride docker
371372 let runDocker = readDockerProcess envOverride
372373 imagesOut <- runDocker [" images" ," --no-trunc" ," -f" ," dangling=false" ]
373374 danglingImagesOut <- runDocker [" images" ," --no-trunc" ," -f" ," dangling=true" ]
@@ -618,7 +619,7 @@ pull =
618619 do config <- asks getConfig
619620 let docker = configDocker config
620621 envOverride <- getEnvOverride (configPlatform config)
621- checkDockerVersion envOverride
622+ checkDockerVersion envOverride docker
622623 pullImage envOverride docker (dockerImage docker)
623624
624625-- | Pull Docker image from registry.
@@ -645,19 +646,21 @@ pullImage envOverride docker image =
645646-- | Check docker version (throws exception if incorrect)
646647checkDockerVersion
647648 :: (MonadIO m , MonadThrow m , MonadLogger m , MonadBaseControl IO m , MonadCatch m )
648- => EnvOverride -> m ()
649- checkDockerVersion envOverride =
649+ => EnvOverride -> DockerOpts -> m ()
650+ checkDockerVersion envOverride docker =
650651 do dockerExists <- doesExecutableExist envOverride " docker"
651652 unless dockerExists (throwM DockerNotInstalledException )
652653 dockerVersionOut <- readDockerProcess envOverride [" --version" ]
653654 case words (decodeUtf8 dockerVersionOut) of
654- (_: _: v: _) ->
655+ (_: _: v: _) -> do
655656 case parseVersionFromString (dropWhileEnd (not . isDigit) v) of
656657 Just v'
657658 | v' < minimumDockerVersion ->
658659 throwM (DockerTooOldException minimumDockerVersion v')
659660 | v' `elem` prohibitedDockerVersions ->
660661 throwM (DockerVersionProhibitedException prohibitedDockerVersions v')
662+ | not (v' `withinRange` dockerRequireDockerVersion docker) ->
663+ (throwM (BadDockerVersionException (dockerRequireDockerVersion docker) v'))
661664 | otherwise ->
662665 return ()
663666 _ -> throwM InvalidVersionOutputException
@@ -816,6 +819,8 @@ data StackDockerException
816819 -- ^ Installed version of @docker@ below minimum version.
817820 | DockerVersionProhibitedException [Version ] Version
818821 -- ^ Installed version of @docker@ is prohibited.
822+ | BadDockerVersionException VersionRange Version
823+ -- ^ Installed version of @docker@ is out of range specified in config file.
819824 | InvalidVersionOutputException
820825 -- ^ Invalid output from @docker --version@.
821826 | HostStackTooOldException Version (Maybe Version )
@@ -864,15 +869,26 @@ instance Show StackDockerException where
864869 show (DockerTooOldException minVersion haveVersion) =
865870 concat [" Minimum docker version '"
866871 ,versionString minVersion
867- ," ' is required (you have '"
872+ ," ' is required by "
873+ ,stackProgName
874+ ," (you have '"
868875 ,versionString haveVersion
869876 ," ')." ]
870877 show (DockerVersionProhibitedException prohibitedVersions haveVersion) =
871- concat [" These Docker versions are prohibited (you have '"
878+ concat [" These Docker versions are incompatible with "
879+ ,stackProgName
880+ ," (you have '"
872881 ,versionString haveVersion
873882 ," '): "
874883 ,intercalate " , " (map versionString prohibitedVersions)
875884 ," ." ]
885+ show (BadDockerVersionException requiredRange haveVersion) =
886+ concat [" The version of 'docker' you are using ("
887+ ,show haveVersion
888+ ," ) is outside the required\n "
889+ ," version range specified in stack.yaml ("
890+ ,T. unpack (versionRangeText requiredRange)
891+ ," )." ]
876892 show InvalidVersionOutputException =
877893 " Cannot get Docker version (invalid 'docker --version' output)."
878894 show (HostStackTooOldException minVersion (Just hostVersion)) =
0 commit comments