Browse code

Ensure that only the layers are compressed and not mnt points

Michael Crosby authored on 2013/11/21 08:37:26
Showing 2 changed files
... ...
@@ -187,7 +187,7 @@ func (graph *Graph) TempLayerArchive(id string, compression archive.Compression,
187 187
 	if err != nil {
188 188
 		return nil, err
189 189
 	}
190
-	a, err := image.TarLayer(compression)
190
+	a, err := image.TarLayer()
191 191
 	if err != nil {
192 192
 		return nil, err
193 193
 	}
... ...
@@ -144,15 +144,32 @@ func jsonPath(root string) string {
144 144
 }
145 145
 
146 146
 // TarLayer returns a tar archive of the image's filesystem layer.
147
-func (img *Image) TarLayer(compression archive.Compression) (archive.Archive, error) {
147
+func (img *Image) TarLayer() (archive.Archive, error) {
148 148
 	if img.graph == nil {
149 149
 		return nil, fmt.Errorf("Can't load storage driver for unregistered image %s", img.ID)
150 150
 	}
151
-	layerPath, err := img.graph.driver.Get(img.ID)
151
+	driver := img.graph.driver
152
+	if differ, ok := driver.(graphdriver.Differ); ok {
153
+		return differ.Diff(img.ID)
154
+	}
155
+
156
+	imgFs, err := driver.Get(img.ID)
152 157
 	if err != nil {
153 158
 		return nil, err
154 159
 	}
155
-	return archive.Tar(layerPath, compression)
160
+	if img.Parent == "" {
161
+		return archive.Tar(imgFs, archive.Uncompressed)
162
+	} else {
163
+		parentFs, err := driver.Get(img.Parent)
164
+		if err != nil {
165
+			return nil, err
166
+		}
167
+		changes, err := archive.ChangesDirs(imgFs, parentFs)
168
+		if err != nil {
169
+			return nil, err
170
+		}
171
+		return archive.ExportChanges(imgFs, changes)
172
+	}
156 173
 }
157 174
 
158 175
 func ValidateID(id string) error {