[libvirt] [sandbox PATCH v2 13/19] Image: Add Volume Support

Cedric Bosdonnat cbosdonnat at suse.com
Mon Aug 17 09:32:52 UTC 2015


On Tue, 2015-08-04 at 20:11 +0000, Eren Yagdiran wrote:
> Volumes let user to map host-paths into guest. Docker containers need volumes because its
> filesystem read-only by default.

Docker doesn't set / read-only by default. Docker volumes are only a way
to share data with the host or other containers. See here:

http://docs.docker.com/userguide/dockervolumes/#volume

--
Cedric

> ---
>  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__':





More information about the libvir-list mailing list