/
docker.go
99 lines (83 loc) 路 3.13 KB
/
docker.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package validations
import (
"context"
"fmt"
"os"
"os/exec"
"strings"
"github.com/aws/eks-anywhere/pkg/logger"
"github.com/aws/eks-anywhere/pkg/semver"
)
const (
recommendedTotalMemory = 6200000000
requiredMajorVersion = 20
minUnsupportedVersion = "4.3.0"
minSupportedWithSettingVersion = "4.4.2"
)
type DockerExecutable interface {
Version(ctx context.Context) (int, error)
AllocatedMemory(ctx context.Context) (uint64, error)
CgroupVersion(ctx context.Context) (int, error)
}
func CheckMinimumDockerVersion(ctx context.Context, dockerExecutable DockerExecutable) error {
installedMajorVersionInt, err := dockerExecutable.Version(ctx)
if err != nil {
return err
}
if installedMajorVersionInt < requiredMajorVersion {
return fmt.Errorf("minimum requirements for docker version have not been met. Install Docker version %d.x.x or above", requiredMajorVersion)
}
return nil
}
func CheckDockerAllocatedMemory(ctx context.Context, dockerExecutable DockerExecutable) {
totalMemoryAllocated, err := dockerExecutable.AllocatedMemory(ctx)
if err != nil {
logger.Error(err, "Failed to validate docker memory: error while reading memory allocated to Docker")
return
}
if totalMemoryAllocated < recommendedTotalMemory {
logger.V(3).Info("Warning: recommended memory to be allocated for Docker is 6 GB, please be aware that not allocating enough memory can cause problems while cluster creation")
}
}
func CheckDockerDesktopVersion(ctx context.Context, dockerExecutable DockerExecutable) error {
dockerDesktopInfoPath := "/Applications/Docker.app/Contents/Info.plist"
if _, err := os.Stat(dockerDesktopInfoPath); err != nil {
return fmt.Errorf("unable to find Docker Desktop info list")
}
cmd := exec.CommandContext(ctx, "defaults", "read", dockerDesktopInfoPath, "CFBundleShortVersionString")
stdout, err := cmd.Output()
if err != nil {
return err
}
return ValidateDockerDesktopVersion(ctx, dockerExecutable, string(stdout))
}
func ValidateDockerDesktopVersion(ctx context.Context, dockerExecutable DockerExecutable, dockerDesktopVersion string) error {
minUnsupportedSemVer, err := semver.New(minUnsupportedVersion)
if err != nil {
return err
}
minSupportWithSettingSemVer, err := semver.New(minSupportedWithSettingVersion)
if err != nil {
return err
}
dockerDesktopSemVer, err := semver.New(strings.TrimSpace(dockerDesktopVersion))
if err != nil {
return err
}
if dockerDesktopSemVer.LessThan(minUnsupportedSemVer) {
// Older versions of docker desktop are supported as is
return nil
}
if dockerDesktopSemVer.LessThan(minSupportWithSettingSemVer) {
return fmt.Errorf("EKS Anywhere does not support Docker desktop versions between 4.3.0 and 4.4.1 on macOS, please refer to https://github.com/aws/eks-anywhere/issues/789 for more information")
}
cgroupVersion, err := dockerExecutable.CgroupVersion(ctx)
if err != nil {
return err
}
if cgroupVersion != 1 {
return fmt.Errorf("EKS Anywhere requires Docker desktop to be configured to use CGroups v1. " +
"Please set `deprecatedCgroupv1:true` in your `~/Library/Group\\ Containers/group.com.docker/settings.json` file")
}
return nil
}