[libvirt] [sandbox PATCH v4 16/21] Image: Add Volume Support

Cedric Bosdonnat cbosdonnat at suse.com
Wed Sep 9 09:08:13 UTC 2015


On Wed, 2015-09-09 at 09:54 +0100, Daniel P. Berrange wrote:
> On Wed, Sep 09, 2015 at 10:41:10AM +0200, Cedric Bosdonnat wrote:
> > On Tue, 2015-09-08 at 17:27 +0100, Daniel P. Berrange wrote:
> > > On Fri, Aug 28, 2015 at 01:47:44PM +0000, Eren Yagdiran wrote:
> > > > Volumes let user to map host-paths into sandbox. Docker containers
> > > > need volumes for data persistence.
> > > 
> > > I'm a little bit puzzelled about how this feature is supposed
> > > to be used. IIUC, in the Docker json file we have something
> > > like
> > > 
> > > {
> > >     "/var/my-app-data/": {},
> > >     "/etc/some-config.d/": {},
> > > }
> > 
> > See here for the full syntax / documentation of volume mounts:
> > http://docs.docker.com/userguide/dockervolumes/#volume
> > 
> > > > +    def getVolumes(self):
> > > > +        volumes = self.json_data['container_config']['Volumes']
> > 
> > It seems this commit needs quite some rework: the Config/Volumes section
> > only gets the destination of the bind mounts created by docker, while
> > HostConfig/Mounts gets all the details:
> 
> IIUC, we shouldn't really look at the HostConfig section at all - that
> reflects the host-specific configuration of the image when it was
> deployed on the original build host. We should work entirely from
> the Config section, to formulate our own host-specific configuration
> as needed by our tools.

Yes, looks like docker build files VOLUME directory only can handle the
automatically created data volume:

http://docs.docker.com/reference/builder/#volume

Thus may be better to ignore bind mounts.

> > 
> >     "Mounts": [
> >         {
> >             "Source": "/public",
> >             "Destination": "/home/public",
> >             "Mode": "",
> >             "RW": true
> >         },
> >         {
> >             "Source": "/home",
> >             "Destination": "ro",
> >             "Mode": "",
> >             "RW": true
> >         },
> >         {
> >             "Name": "43c4b4472e74bc5d1cf0a390f8707decade340df5e10cdea468bb191cac14a76",
> >             "Source": "/var/lib/docker/volumes/43c4b4472e74bc5d1cf0a390f8707decade340df5e10cdea468bb191cac14a76/_data",
> >             "Destination": "/srv/www",
> >             "Driver": "local",
> >             "Mode": "",
> >             "RW": true
> >         }
> >     ],
> > 
> > Note in this sample, that at least some versions of docker can't
> > properly handle the -v /path:ro flag (documented) and try to create a
> > bind mount to /ro ;)
> > 
> > In the same config, I'm having this for the Volumes:
> > 
> >         "Volumes": {
> >             "/srv/www": {}
> >         },
> > 
> > It really seems like volumes are just bind mounts to an automatically
> > created image. The purpose of this feature is easy data storing outside
> > the rootfs image.
> > 
> > Volumes and Mounts are both created with the docker run -v option. The
> > --volumes-from will just add the required items in the Mounts section of
> > the docker container config.
> > 
> > > > +        volumelist = []
> > > > +        if isinstance(volumes,collections.Iterable):
> > > > +          for key,value in volumes.iteritems():
> > > > +            volumelist.append(key)
> > > > +        return volumelist
> > > 
> > > This will just return a python list
> > > 
> > >   ["/var/my-app-data/", "/etc/some-config.d"]
> > > 
> > > 
> > > > diff --git a/virt-sandbox-image/virt-sandbox-image.py b/virt-sandbox-image/virt-sandbox-image.py
> > > > index 058738a..79f8d8c 100755
> > > > --- a/virt-sandbox-image/virt-sandbox-image.py
> > > 
> > > > @@ -150,6 +151,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(":")
> > > 
> > > We don't have any ':' in our returned list from getVolumes()
> > 
> > Indeed there is no ':' in the Volumes list, and there will be none in
> > the mounts section too. I think Eren mixed up the docker parameters and
> > the config file values.
> 
> I think my confusion was due to this code block handling both
> the user supplied command line arguments, which can include
> the ':', and the image supplied mounts which don't include
> the ':'
> 
> 
> When I reposted this series, I put this patch last of all, so my
> inclination at this point is to not merge it at all yet. We'll just
> focus on the rest of the series, and investigate the volume stuff
> some more before considering it for merge.

Indeed.
--
Cedric




More information about the libvir-list mailing list