Volumes let user to map host-paths into guest. Docker containers need volumes because its
filesystem read-only by default.
---
virt-sandbox-image/sources/DockerSource.py | 12 ++++++++++++
virt-sandbox-image/sources/Source.py | 4 ++++
virt-sandbox-image/virt-sandbox-image.py | 22 ++++++++++++++++++++++
3 files changed, 38 insertions(+)
diff --git a/virt-sandbox-image/sources/DockerSource.py
b/virt-sandbox-image/sources/DockerSource.py
index 74feb3e..44bc238 100644
--- a/virt-sandbox-image/sources/DockerSource.py
+++ b/virt-sandbox-image/sources/DockerSource.py
@@ -31,6 +31,7 @@ import traceback
import os
import subprocess
import shutil
+import collections
class DockerConfParser():
@@ -40,6 +41,13 @@ class DockerConfParser():
def getRunCommand(self):
cmd = self.json_data['container_config']['Cmd'][2]
return cmd[cmd.index('"') + 1:cmd.rindex('"')]
+ def getVolumes(self):
+ volumes = self.json_data['container_config']['Volumes']
+ volumelist = []
+ if isinstance(volumes,collections.Iterable):
+ for key,value in volumes.iteritems():
+ volumelist.append(key)
+ return volumelist
class DockerSource(Source):
default_index_server = "index.docker.io"
@@ -399,5 +407,9 @@ class DockerSource(Source):
commandToRun = configParser.getRunCommand()
return commandToRun
+ def get_volume(self,configfile):
+ configParser = DockerConfParser(configfile)
+ return configParser.getVolumes()
+
def debug(msg):
sys.stderr.write(msg)
diff --git a/virt-sandbox-image/sources/Source.py b/virt-sandbox-image/sources/Source.py
index 6e2f5fb..6898c15 100644
--- a/virt-sandbox-image/sources/Source.py
+++ b/virt-sandbox-image/sources/Source.py
@@ -49,3 +49,7 @@ class Source():
@abstractmethod
def get_disk(self,**args):
pass
+
+ @abstractmethod
+ def get_volume(self,**args):
+ pass
diff --git a/virt-sandbox-image/virt-sandbox-image.py
b/virt-sandbox-image/virt-sandbox-image.py
index 5fc7f44..b12b99b 100755
--- a/virt-sandbox-image/virt-sandbox-image.py
+++ b/virt-sandbox-image/virt-sandbox-image.py
@@ -103,6 +103,7 @@ def check_connect(connectstr):
def run(args):
try:
+ default_dir = "/var/lib/libvirt/storage"
if args.connect is not None:
check_connect(args.connect)
source = dynamic_source_loader(args.source)
@@ -121,6 +122,25 @@ def run(args):
if networkArgs is not None:
params.append('-N')
params.append(networkArgs)
+ allVolumes = source.get_volume(configfile)
+ volumeArgs = args.volume
+ if volumeArgs is not None:
+ allVolumes = allVolumes + volumeArgs
+ for volume in allVolumes:
+ volumeSplit = volume.split(":")
+ volumelen = len(volumeSplit)
+ if volumelen == 2:
+ hostPath = volumeSplit[0]
+ guestPath = volumeSplit[1]
+ elif volumelen == 1:
+ guestPath = volumeSplit[0]
+ hostPath = default_dir + guestPath
+ if not os.path.exists(hostPath):
+ os.makedirs(hostPath)
+ else:
+ pass
+ params.append("--mount")
+ params.append("host-bind:%s=%s" %(guestPath,hostPath))
params.append('--')
params.append(commandToRun)
cmd = cmd + params
@@ -193,6 +213,8 @@ def gen_run_args(subparser):
help=_("Igniter command for image"))
parser.add_argument("-n","--network",
help=_("Network params for running template"))
+ parser.add_argument("-v","--volume",action="append",
+ help=_("Volume params for running template"))
parser.set_defaults(func=run)
if __name__ == '__main__':
--
2.1.0