summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Hess2014-10-10 13:45:43 -0400
committerJoey Hess2014-10-10 13:47:41 -0400
commitdf0c0e56cb60c7b00c1d1e715b990a9a1ca655ed (patch)
tree77da98b538f1f43518c63bf09f98168d029a729d
parent0a34736d6afe8af548b717924b94fdb1ad34ff1e (diff)
Docker: Avoid committing container every time it's started up.
This was using a lot of disk space. Instead, start the container, and then use the running container to check if docker is running it with the right params. In the unlikely case that the params have changed, we still need to commit the container and restart it. The common case of eg a reboot no longer commits though.
-rw-r--r--debian/changelog1
-rw-r--r--src/Propellor/Property/Docker.hs35
2 files changed, 23 insertions, 13 deletions
diff --git a/debian/changelog b/debian/changelog
index 2df7a57f..012826bd 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -9,6 +9,7 @@ propellor (0.9.0) unstable; urgency=medium
immediate upgrades to the next stable release.
* debCdn switched from cdn.debian.net to http.debian.net, which seems to be
better managed now.
+ * Docker: Avoid committing container every time it's started up.
-- Joey Hess <joeyh@debian.org> Fri, 10 Oct 2014 11:37:45 -0400
diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs
index 65b65f5e..65a4a258 100644
--- a/src/Propellor/Property/Docker.hs
+++ b/src/Propellor/Property/Docker.hs
@@ -314,27 +314,33 @@ runningContainer :: ContainerId -> Image -> [RunParam] -> Property
runningContainer cid@(ContainerId hn cn) image runps = containerDesc cid $ property "running" $ do
l <- liftIO $ listContainers RunningContainers
if cid `elem` l
- then do
- -- Check if the ident has changed; if so the
- -- parameters of the container differ and it must
- -- be restarted.
- runningident <- liftIO $ getrunningident
- if runningident == Just ident
- then noChange
- else do
- liftIO $ print ("runningident", runningident, "vs", ident)
- void $ liftIO $ stopContainer cid
- restartcontainer
+ then checkident
else ifM (liftIO $ elem cid <$> listContainers AllContainers)
- ( restartcontainer
+ ( do
+ -- The container exists, but is not
+ -- running. Its parameters may have
+ -- changed, but we cannot tell without
+ -- starting it up first.
+ void $ liftIO $ startContainer cid
+ checkident
, go image
)
where
ident = ContainerIdent image hn cn runps
+ -- Check if the ident has changed; if so the
+ -- parameters of the container differ and it must
+ -- be restarted.
+ checkident = do
+ runningident <- liftIO $ getrunningident
+ if runningident == Just ident
+ then noChange
+ else do
+ void $ liftIO $ stopContainer cid
+ restartcontainer
+
restartcontainer = do
oldimage <- liftIO $ fromMaybe image <$> commitContainer cid
- liftIO $ print ("restarting", oldimage)
void $ liftIO $ removeContainer cid
go oldimage
@@ -435,6 +441,9 @@ provisionContainer cid = containerDesc cid $ property "provisioned" $ liftIO $ d
stopContainer :: ContainerId -> IO Bool
stopContainer cid = boolSystem dockercmd [Param "stop", Param $ fromContainerId cid ]
+startContainer :: ContainerId -> IO Bool
+startContainer cid = boolSystem dockercmd [Param "start", Param $ fromContainerId cid ]
+
stoppedContainer :: ContainerId -> Property
stoppedContainer cid = containerDesc cid $ property desc $
ifM (liftIO $ elem cid <$> listContainers RunningContainers)