Currently, the temporary file storing downloaded layer data is only
removed after a successful download or a digest verification error. A
transport-level error does not cause it to be removed. This is a
regression from 1.9 that could cause disk usage to grow until the Docker
daemon is restarted.
Signed-off-by: Aaron Lehmann <aaron.lehmann@docker.com>
| ... | ... |
@@ -171,6 +171,10 @@ func (ld *v2LayerDescriptor) Download(ctx context.Context, progressOutput progre |
| 171 | 171 |
|
| 172 | 172 |
_, err = io.Copy(tmpFile, io.TeeReader(reader, verifier)) |
| 173 | 173 |
if err != nil {
|
| 174 |
+ tmpFile.Close() |
|
| 175 |
+ if err := os.Remove(tmpFile.Name()); err != nil {
|
|
| 176 |
+ logrus.Errorf("Failed to remove temp file: %s", tmpFile.Name())
|
|
| 177 |
+ } |
|
| 174 | 178 |
return nil, 0, retryOnError(err) |
| 175 | 179 |
} |
| 176 | 180 |
|
| ... | ... |
@@ -179,8 +183,9 @@ func (ld *v2LayerDescriptor) Download(ctx context.Context, progressOutput progre |
| 179 | 179 |
if !verifier.Verified() {
|
| 180 | 180 |
err = fmt.Errorf("filesystem layer verification failed for digest %s", ld.digest)
|
| 181 | 181 |
logrus.Error(err) |
| 182 |
+ |
|
| 182 | 183 |
tmpFile.Close() |
| 183 |
- if err := os.RemoveAll(tmpFile.Name()); err != nil {
|
|
| 184 |
+ if err := os.Remove(tmpFile.Name()); err != nil {
|
|
| 184 | 185 |
logrus.Errorf("Failed to remove temp file: %s", tmpFile.Name())
|
| 185 | 186 |
} |
| 186 | 187 |
|
| ... | ... |
@@ -191,7 +196,14 @@ func (ld *v2LayerDescriptor) Download(ctx context.Context, progressOutput progre |
| 191 | 191 |
|
| 192 | 192 |
logrus.Debugf("Downloaded %s to tempfile %s", ld.ID(), tmpFile.Name())
|
| 193 | 193 |
|
| 194 |
- tmpFile.Seek(0, 0) |
|
| 194 |
+ _, err = tmpFile.Seek(0, os.SEEK_SET) |
|
| 195 |
+ if err != nil {
|
|
| 196 |
+ tmpFile.Close() |
|
| 197 |
+ if err := os.Remove(tmpFile.Name()); err != nil {
|
|
| 198 |
+ logrus.Errorf("Failed to remove temp file: %s", tmpFile.Name())
|
|
| 199 |
+ } |
|
| 200 |
+ return nil, 0, xfer.DoNotRetry{Err: err}
|
|
| 201 |
+ } |
|
| 195 | 202 |
return ioutils.NewReadCloserWrapper(tmpFile, tmpFileCloser(tmpFile)), size, nil |
| 196 | 203 |
} |
| 197 | 204 |
|