@@ -7,6 +7,7 @@ module Docker.Client.Api (
77 , createContainer
88 , startContainer
99 , stopContainer
10+ , waitContainer
1011 , killContainer
1112 , restartContainer
1213 , pauseContainer
@@ -22,7 +23,7 @@ module Docker.Client.Api (
2223 , getDockerVersion
2324 ) where
2425
25−import Control.Monad.Catch (MonadMask(..))
26+import Control.Monad.Catch (MonadMask(..))
2627import Control.Monad.IO.Class
2728import Control.Monad.Reader (ask, lift)
2829import Data.Aeson (FromJSON, eitherDecode')
@@ -31,8 +32,9 @@ import qualified Data.ByteString.Lazy as BSL
3132import Data.Conduit (Sink)
3233import qualified Data.Conduit.Binary as Conduit
3334import qualified Data.Text as Text
34−import Network.HTTP.Client (responseStatus)
35−import Network.HTTP.Types (StdMethod (..))
35+import Network.HTTP.Client (responseStatus)
36+import Network.HTTP.Types (StdMethod (..))
37+import System.Exit (ExitCode(..))
3638
3739import Docker.Client.Http
3840import Docker.Client.Types
@@ -105,6 +107,14 @@ startContainer sopts cid = requestUnit POST $ StartContainerEndpoint sopts cid
105107stopContainer :: forall m. (MonadIO m, MonadMask m) => Timeout -> ContainerID -> DockerT m (Either DockerError ())
106108stopContainer t cid = requestUnit POST $ StopContainerEndpoint t cid
107109
110+-- | Blocks until a container with the given 'ContainerID' stops,
111+-- then returns the exit code
112+waitContainer :: forall m. (MonadIO m, MonadMask m) => ContainerID -> DockerT m (Either DockerError ExitCode)
113+waitContainer cid = fmap (fmap statusCodeToExitCode) (requestHelper POST (WaitContainerEndpoint cid) >>= parseResponse)
114+ where
115+ statusCodeToExitCode (StatusCode 0) = ExitSuccess
116+ statusCodeToExitCode (StatusCode x) = ExitFailure x
117+
108118-- | Sends a 'Signal' to the container with the given 'ContainerID'. Same
109119-- as 'stopContainer' but you choose the signal directly.
110120killContainer :: forall m. (MonadIO m, MonadMask m) => Signal -> ContainerID -> DockerT m (Either DockerError ())