Bladeren bron

Fix volume CreatedAt being altered on initialization

The CreatedAt date was determined from the volume's `_data`
directory (`/var/lib/docker/volumes/<volumename>/_data`).
However, when initializing a volume, this directory is updated,
causing the date to change.

Instead of using the `_data` directory, use its parent directory,
which is not updated afterwards, and should reflect the time that
the volume was created.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
Sebastiaan van Stijn 6 jaren geleden
bovenliggende
commit
01fd23b625
3 gewijzigde bestanden met toevoegingen van 18 en 2 verwijderingen
  1. 16 0
      integration/volume/volume_test.go
  2. 1 1
      volume/local/local_unix.go
  3. 1 1
      volume/local/local_windows.go

+ 16 - 0
integration/volume/volume_test.go

@@ -3,6 +3,7 @@ package volume
 import (
 	"context"
 	"net/http"
+	"os"
 	"path/filepath"
 	"strings"
 	"testing"
@@ -104,6 +105,21 @@ func TestVolumesInspect(t *testing.T) {
 	createdAt, err := time.Parse(time.RFC3339, strings.TrimSpace(inspected.CreatedAt))
 	assert.NilError(t, err)
 	assert.Check(t, createdAt.Unix()-now.Unix() < 60, "CreatedAt (%s) exceeds creation time (%s) 60s", createdAt, now)
+
+	// update atime and mtime for the "_data" directory (which would happen during volume initialization)
+	modifiedAt := time.Now().Local().Add(5 * time.Hour)
+	err = os.Chtimes(inspected.Mountpoint, modifiedAt, modifiedAt)
+	assert.NilError(t, err)
+
+	inspected, err = client.VolumeInspect(ctx, vol.Name)
+	assert.NilError(t, err)
+
+	createdAt2, err := time.Parse(time.RFC3339, strings.TrimSpace(inspected.CreatedAt))
+	assert.NilError(t, err)
+
+	// Check that CreatedAt didn't change after updating atime and mtime of the "_data" directory
+	// Related issue: #38274
+	assert.Equal(t, createdAt, createdAt2)
 }
 
 // TestVolumesInvalidJSON tests that POST endpoints that expect a body return

+ 1 - 1
volume/local/local_unix.go

@@ -164,7 +164,7 @@ func (v *localVolume) unmount() error {
 }
 
 func (v *localVolume) CreatedAt() (time.Time, error) {
-	fileInfo, err := os.Stat(v.path)
+	fileInfo, err := os.Stat(v.rootPath)
 	if err != nil {
 		return time.Time{}, err
 	}

+ 1 - 1
volume/local/local_windows.go

@@ -44,7 +44,7 @@ func (v *localVolume) postMount() error {
 }
 
 func (v *localVolume) CreatedAt() (time.Time, error) {
-	fileInfo, err := os.Stat(v.path)
+	fileInfo, err := os.Stat(v.rootPath)
 	if err != nil {
 		return time.Time{}, err
 	}