| ... | ... |
@@ -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 {
|