1
1
package docker
2
2
3
3
import (
4
+ "encoding/json"
4
5
"fmt"
6
+ "github.com/abiosoft/colima/config"
7
+ "path/filepath"
5
8
)
6
9
7
10
func (d dockerRuntime ) setupSocketSymlink () error {
@@ -27,20 +30,6 @@ func (d dockerRuntime) setupInVM() error {
27
30
return fmt .Errorf ("error installing in VM: %w" , err )
28
31
}
29
32
30
- // enable buildkit by default.
31
- // eventually, there should be an easy way to configure docker.
32
- // users may want to set other configs like registries e.t.c.
33
-
34
- err = d .guest .Run ("sudo" , "mkdir" , "-p" , "/etc/docker" )
35
- if err != nil {
36
- return fmt .Errorf ("error setting up default config: %w" , err )
37
- }
38
-
39
- err = d .guest .Run ("sudo" , "sh" , "-c" , `echo '{"features":{"buildkit":true},"exec-opts":["native.cgroupdriver=cgroupfs"]}' > /etc/docker/daemon.json` )
40
- if err != nil {
41
- return fmt .Errorf ("error enabling buildkit: %w" , err )
42
- }
43
-
44
33
return nil
45
34
}
46
35
@@ -54,3 +43,66 @@ func (d dockerRuntime) fixUserPermission() error {
54
43
}
55
44
return nil
56
45
}
46
+
47
+ var daemonJson struct {
48
+ Features struct {
49
+ BuildKit bool `json:"buildkit"`
50
+ } `json:"features"`
51
+ ExecOpts []string `json:"exec-opts"`
52
+ }
53
+
54
+ func init () {
55
+ // enable buildkit by default.
56
+ daemonJson .Features .BuildKit = true
57
+ // k3s needs cgroupfs
58
+ daemonJson .ExecOpts = append (daemonJson .ExecOpts , "native.cgroupdriver=cgroupfs" )
59
+ }
60
+
61
+ func (d dockerRuntime ) createDaemonFile (fileName string ) error {
62
+ b , err := json .MarshalIndent (daemonJson , "" , " " )
63
+ if err != nil {
64
+ return fmt .Errorf ("error marshaling deamon.json: %w" , err )
65
+ }
66
+ return d .host .Write (fileName , string (b ))
67
+ }
68
+
69
+ func (d dockerRuntime ) setupDaemonFile () error {
70
+ log := d .Logger ()
71
+ daemonFile := filepath .Join (config .Dir (), "docker" , "daemon.json" )
72
+
73
+ // ensure config directory
74
+ if err := d .host .RunQuiet ("mkdir" , "-p" , filepath .Dir (daemonFile )); err != nil {
75
+ return fmt .Errorf ("error creating config directory: %w" , err )
76
+ }
77
+
78
+ // check daemon.json or create default
79
+ if _ , err := d .host .Stat (daemonFile ); err != nil {
80
+ log .Warnln ("daemon.json not found, falling back to default" )
81
+ if err := d .createDaemonFile (daemonFile ); err != nil {
82
+ return fmt .Errorf ("error creating daemon.json: %w" , err )
83
+ }
84
+ }
85
+
86
+ daemonFileInVM := filepath .Join (config .CacheDir (), "daemon.json" )
87
+
88
+ // copy to vm, cache directory is shared by host and vm and guaranteed to be mounted.
89
+ if err := d .host .RunQuiet ("cp" , daemonFile , daemonFileInVM ); err != nil {
90
+ return fmt .Errorf ("error copying daemon.json to VM: %w" , err )
91
+ }
92
+
93
+ // copy to location in VM
94
+ if err := d .guest .RunQuiet ("sudo" , "mkdir" , "-p" , "/etc/docker" ); err != nil {
95
+ return fmt .Errorf ("error setting up default config: %w" , err )
96
+ }
97
+
98
+ if err := d .guest .RunQuiet ("sudo" , "cp" , daemonFileInVM , "/etc/docker/daemon.json" ); err != nil {
99
+ return fmt .Errorf ("error copying deamon.json: %w" , err )
100
+ }
101
+
102
+ // config changed, restart is a must
103
+ if d .Running () {
104
+ return d .guest .RunQuiet ("sudo" , "service" , "docker" , "stop" )
105
+ }
106
+
107
+ return nil
108
+ }
0 commit comments