2024-12-18 06:26:49 +00:00
|
|
|
From 12c8b7a22f7140b5b4d2c87a7e5d70da082fe558 Mon Sep 17 00:00:00 2001
|
2024-12-17 13:26:31 +00:00
|
|
|
From: Aleksa Sarai <cyphar@cyphar.com>
|
|
|
|
Date: Wed, 19 Jun 2024 16:30:49 +1000
|
2024-12-18 06:26:49 +00:00
|
|
|
Subject: [PATCH 08/11] bsc1214855: volume: use AtomicWriteFile to save volume
|
2024-12-17 13:26:31 +00:00
|
|
|
options
|
|
|
|
|
|
|
|
If the system (or Docker) crashes while saivng the volume options, on
|
|
|
|
restart the daemon will error out when trying to read the options file
|
|
|
|
because it doesn't contain valid JSON.
|
|
|
|
|
|
|
|
In such a crash scenario, the new volume will be treated as though it
|
|
|
|
has the default options configuration. This is not ideal, but volumes
|
|
|
|
created on very old Docker versions (pre-1.11[1], circa 2016) do not
|
|
|
|
have opts.json and so doing some kind of cleanup when loading the volume
|
|
|
|
store (even if we take care to only delete empty volumes) could delete
|
|
|
|
existing volumes carried over from very old Docker versions that users
|
|
|
|
would not expect to disappear.
|
|
|
|
|
|
|
|
Ultimately, if a user creates a volume and the system crashes, a volume
|
|
|
|
that has the wrong config is better than Docker not being able to start.
|
|
|
|
|
|
|
|
[1]: commit b05b2370757d ("Support mount opts for `local` volume driver")
|
|
|
|
|
|
|
|
SUSE-Bugs: https://bugzilla.suse.com/show_bug.cgi?id=1214855
|
2024-12-18 06:26:49 +00:00
|
|
|
(Cherry-picked from commit b4c20da143502e5fc21cc4996b63e83691c515bf.)
|
2024-12-17 13:26:31 +00:00
|
|
|
Signed-off-by: Aleksa Sarai <cyphar@cyphar.com>
|
|
|
|
---
|
|
|
|
volume/local/local.go | 3 ++-
|
|
|
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
|
|
|
|
|
|
|
diff --git a/volume/local/local.go b/volume/local/local.go
|
|
|
|
index b4f3a3669a84..077b26f1b813 100644
|
|
|
|
--- a/volume/local/local.go
|
|
|
|
+++ b/volume/local/local.go
|
|
|
|
@@ -16,6 +16,7 @@ import (
|
|
|
|
"github.com/docker/docker/daemon/names"
|
|
|
|
"github.com/docker/docker/errdefs"
|
|
|
|
"github.com/docker/docker/pkg/idtools"
|
|
|
|
+ "github.com/docker/docker/pkg/ioutils"
|
|
|
|
"github.com/docker/docker/quota"
|
|
|
|
"github.com/docker/docker/volume"
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
@@ -381,7 +382,7 @@ func (v *localVolume) saveOpts() error {
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
- err = os.WriteFile(filepath.Join(v.rootPath, "opts.json"), b, 0600)
|
|
|
|
+ err = ioutils.AtomicWriteFile(filepath.Join(v.rootPath, "opts.json"), b, 0o600)
|
|
|
|
if err != nil {
|
|
|
|
return errdefs.System(errors.Wrap(err, "error while persisting volume options"))
|
|
|
|
}
|
|
|
|
--
|
2024-12-18 06:26:49 +00:00
|
|
|
2.47.1
|
2024-12-17 13:26:31 +00:00
|
|
|
|