/
container_runtime.go
84 lines (69 loc) · 2.61 KB
/
container_runtime.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
package common
import (
"context"
"fmt"
"os"
"strings"
"github.com/werf/werf/pkg/buildah"
"github.com/werf/werf/pkg/container_runtime"
"github.com/werf/werf/pkg/docker"
)
func ContainerRuntimeProcessStartupHook() (bool, error) {
buildahMode := GetContainerRuntimeBuildahMode()
switch {
case buildahMode != "":
return buildah.ProcessStartupHook(buildahMode)
case strings.HasPrefix(os.Args[0], "buildah-") || strings.HasPrefix(os.Args[0], "chrootuser-") || strings.HasPrefix(os.Args[0], "storage-"):
return buildah.ProcessStartupHook("native-rootless")
}
return false, nil
}
func GetContainerRuntimeBuildahMode() buildah.Mode {
return buildah.Mode(os.Getenv("WERF_CONTAINER_RUNTIME_BUILDAH"))
}
func wrapContainerRuntime(containerRuntime container_runtime.ContainerRuntime) container_runtime.ContainerRuntime {
if os.Getenv("WERF_PERF_TEST_CONTAINER_RUNTIME") == "1" {
return container_runtime.NewPerfCheckContainerRuntime(containerRuntime)
}
return containerRuntime
}
func InitProcessContainerRuntime(ctx context.Context, cmdData *CmdData) (container_runtime.ContainerRuntime, context.Context, error) {
buildahMode := GetContainerRuntimeBuildahMode()
if buildahMode != "" {
resolvedMode := buildah.ResolveMode(buildahMode)
if resolvedMode == buildah.ModeDockerWithFuse {
newCtx, err := InitProcessDocker(ctx, cmdData)
if err != nil {
return nil, ctx, fmt.Errorf("unable to init process docker for buildah container runtime: %s", err)
}
ctx = newCtx
}
insecure := *cmdData.InsecureRegistry || *cmdData.SkipTlsVerifyRegistry
b, err := buildah.NewBuildah(resolvedMode, buildah.BuildahOpts{
CommonBuildahOpts: buildah.CommonBuildahOpts{
Insecure: insecure,
},
})
if err != nil {
return nil, ctx, fmt.Errorf("unable to get buildah client: %s", err)
}
return wrapContainerRuntime(container_runtime.NewBuildahRuntime(b)), ctx, nil
}
newCtx, err := InitProcessDocker(ctx, cmdData)
if err != nil {
return nil, ctx, fmt.Errorf("unable to init process docker for docker-server container runtime: %s", err)
}
ctx = newCtx
return wrapContainerRuntime(container_runtime.NewDockerServerRuntime()), ctx, nil
}
func InitProcessDocker(ctx context.Context, cmdData *CmdData) (context.Context, error) {
if err := docker.Init(ctx, *cmdData.DockerConfig, *cmdData.LogVerbose, *cmdData.LogDebug, *cmdData.Platform); err != nil {
return ctx, fmt.Errorf("unable to init docker for buildah container runtime: %s", err)
}
ctxWithDockerCli, err := docker.NewContext(ctx)
if err != nil {
return ctx, fmt.Errorf("unable to init context for docker: %s", err)
}
ctx = ctxWithDockerCli
return ctx, nil
}