Skip to content

Commit 6ad1ef1

Browse files
committed
docker: make daemon.json editable for additional configs
Signed-off-by: Abiola Ibrahim <[email protected]>
1 parent b02ac10 commit 6ad1ef1

File tree

3 files changed

+70
-15
lines changed

3 files changed

+70
-15
lines changed

app.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ func (c colimaApp) Start(conf config.Config) error {
8383
return fmt.Errorf("error setting kubernetes version: %w", err)
8484
}
8585

86-
// provision container runtime
86+
// provision container runtimes
8787
for _, cont := range containers {
8888
if err := cont.Provision(); err != nil {
8989
return fmt.Errorf("error provisioning %s: %w", cont.Name(), err)

environment/container/docker/docker.go

+3
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ func (d dockerRuntime) Provision() error {
8989
})
9090
a.Add(func() error { return createLaunchdScript(d.launchd) })
9191

92+
// daemon.json
93+
a.Add(d.setupDaemonFile)
94+
9295
return a.Exec()
9396
}
9497

environment/container/docker/setup.go

+66-14
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package docker
22

33
import (
4+
"encoding/json"
45
"fmt"
6+
"github.com/abiosoft/colima/config"
7+
"path/filepath"
58
)
69

710
func (d dockerRuntime) setupSocketSymlink() error {
@@ -27,20 +30,6 @@ func (d dockerRuntime) setupInVM() error {
2730
return fmt.Errorf("error installing in VM: %w", err)
2831
}
2932

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-
4433
return nil
4534
}
4635

@@ -54,3 +43,66 @@ func (d dockerRuntime) fixUserPermission() error {
5443
}
5544
return nil
5645
}
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

Comments
 (0)