Jelajahi Sumber

add docker container configurations

reid 2 tahun lalu
induk
melakukan
230ffadfeb
4 mengubah file dengan 143 tambahan dan 0 penghapusan
  1. 22 0
      docker/docker.go
  2. 65 0
      docker/minio.go
  3. 55 0
      docker/netdata.go
  4. 1 0
      structs/structs.go

+ 22 - 0
docker/docker.go

@@ -115,6 +115,7 @@ func GetContainerStats(containerName string) (structs.ContainerStats, error) {
 func StartContainer(containerName string, containerType string) (structs.ContainerState, error) {
 	var containerState structs.ContainerState
 	var containerConfig container.Config
+	var hostConfig container.HostConfig
 	// switch on containerType to process containerConfig
 	switch containerType { 
 	case "vere":
@@ -123,6 +124,26 @@ func StartContainer(containerName string, containerType string) (structs.Contain
 		if err != nil {
 			return containerState, err
 		}
+	case "netdata":
+		_, _, err := netdataContainerConf()
+		if err != nil {
+			return containerState, err
+		}
+	case "minio": 
+		_, _, err := minioContainerConf(containerName)
+		if err != nil {
+			return containerState, err
+		}
+	case "miniomc":
+		_, err := mcContainerConf()
+		if err != nil {
+			return containerState, err
+		}
+	// case "wireguard":
+	// 	_, err := wgContainerConf()
+	// 	if err != nil {
+	// 		return containerState, err
+	// 	}
 	default:
 		errmsg := fmt.Errorf("Unrecognized container type %s",containerType)
 		return containerState, errmsg
@@ -244,6 +265,7 @@ func StartContainer(containerName string, containerType string) (structs.Contain
 		ActualStatus:  containerDetails.State.Status, // what the daemon reports
 		CreatedAt:     containerDetails.Created,      // this is a string
 		Config:		   containerConfig,				  // container.Config struct constructed above
+		Host:		   hostConfig,					  // host.Config struct constructed above
 	}
 	return containerState, err
 }

+ 65 - 0
docker/minio.go

@@ -4,7 +4,10 @@ import (
 	"fmt"
 	"goseg/config"
 	"os"
+	"strings"
 	"path/filepath"
+	"github.com/docker/docker/api/types/container"
+	"github.com/docker/docker/api/types/mount"
 )
 
 func LoadMC() error {
@@ -47,3 +50,65 @@ func LoadMinIOs() error {
 	}
 	return nil
 }
+
+// minio container config builder
+func minioContainerConf(containerName string) (container.Config, container.HostConfig, error) {
+	var containerConfig container.Config
+	var hostConfig container.HostConfig
+	shipName := strings.Split(containerName,"_")[1]
+	err := config.LoadUrbitConfig(shipName)
+	if err != nil {
+		errmsg := fmt.Errorf("Error loading %s config: %v", shipName, err)
+		return containerConfig, hostConfig, errmsg
+	}
+	shipConf := config.UrbitConf(shipName)
+	// construct the container metadata from version server info
+	containerInfo, err := GetLatestContainerInfo("minio")
+	if err != nil {
+		return containerConfig, hostConfig, err
+	}
+	desiredImage := fmt.Sprintf("%s:%s@sha256:%s", containerInfo["repo"], containerInfo["tag"], containerInfo["hash"])
+	command := fmt.Sprintf("server /data --console-address :%s --address :%s", string(shipConf.WgConsolePort), string(shipConf.WgS3Port))
+	environment := []string{
+		fmt.Sprintf("MINIO_ROOT_USER=%s", shipName),
+		fmt.Sprintf("MINIO_ROOT_PASSWORD=%s", shipConf.MinioPassword),
+		fmt.Sprintf("MINIO_DOMAIN=s3.%s", shipConf.WgURL),
+		fmt.Sprintf("MINIO_SERVER_URL=https://s3.%s", shipConf.WgURL),
+	}
+	mounts := []mount.Mount{
+		{
+			Type:   mount.TypeBind,
+			Source: shipName,
+			Target: "/data",
+		},
+	}
+	containerConfig = container.Config{
+		Image:      desiredImage,
+		Cmd:        []string{command},
+		Env:        environment,
+	}
+	hostConfig = container.HostConfig{
+		NetworkMode: "container:wireguard",
+		Mounts:      mounts,
+	}
+	return containerConfig, hostConfig, nil
+}
+
+// miniomc container config builder
+func mcContainerConf() (container.Config, error) {
+	var containerConfig container.Config
+	// construct the container metadata from version server info
+	containerInfo, err := GetLatestContainerInfo("miniomc")
+	if err != nil {
+		return containerConfig, err
+	}
+	desiredTag := containerInfo["tag"]
+	desiredHash := containerInfo["hash"]
+	desiredRepo := containerInfo["repo"]
+	desiredImage := fmt.Sprintf("%s:%s@sha256:%s", desiredRepo, desiredTag, desiredHash)
+	// construct the container config struct
+	containerConfig = container.Config{
+		Image:      desiredImage,
+	}
+	return containerConfig, nil
+}

+ 55 - 0
docker/netdata.go

@@ -5,6 +5,8 @@ import (
 	"goseg/config"
 	"os"
 	"path/filepath"
+	"github.com/docker/docker/api/types/container"
+	"github.com/docker/go-connections/nat"
 )
 
 func LoadNetdata() error {
@@ -30,3 +32,56 @@ func LoadNetdata() error {
 	config.UpdateContainerState("netdata", info)
 	return nil
 }
+
+// netdata container config builder
+func netdataContainerConf() (container.Config, container.HostConfig, error) {
+	var containerConfig container.Config
+	var hostConfig container.HostConfig
+	// construct the container metadata from version server info
+	containerInfo, err := GetLatestContainerInfo("netdata")
+	if err != nil {
+		return containerConfig, hostConfig, err
+	}
+	desiredTag := containerInfo["tag"]
+	desiredHash := containerInfo["hash"]
+	desiredRepo := containerInfo["repo"]
+	desiredImage := fmt.Sprintf("%s:%s@sha256:%s", desiredRepo, desiredTag, desiredHash)
+	// construct the container config struct
+	containerConfig = container.Config{
+		Image:      desiredImage,
+		ExposedPorts: nat.PortSet{"19999/tcp": struct{}{}},
+		Volumes: map[string]struct{}{
+			"/etc/netdata":            {},
+			"/var/lib/netdata":        {},
+			"/var/cache/netdata":      {},
+			"/host/etc/passwd":        {},
+			"/host/etc/group":         {},
+			"/host/proc":              {},
+			"/host/sys":               {},
+			"/host/etc/os-release":    {},
+		},
+	}
+	hostConfig = container.HostConfig{
+		CapAdd: []string{"SYS_PTRACE"},
+		RestartPolicy: container.RestartPolicy{
+			Name: "unless-stopped",
+		},
+		SecurityOpt: []string{"apparmor=unconfined"},
+		PortBindings: nat.PortMap{
+			"19999/tcp": []nat.PortBinding{
+				{HostIP: "0.0.0.0", HostPort: "19999"},
+			},
+		},
+		Binds: []string{
+			"netdataconfig:/etc/netdata",
+			"netdatalib:/var/lib/netdata",
+			"netdatacache:/var/cache/netdata",
+			"/etc/passwd:/host/etc/passwd:ro",
+			"/etc/group:/host/etc/group:ro",
+			"/proc:/host/proc:ro",
+			"/sys:/host/sys:ro",
+			"/etc/os-release:/host/etc/os-release:ro",
+		},
+	}
+	return containerConfig, hostConfig, nil
+}

+ 1 - 0
structs/structs.go

@@ -28,4 +28,5 @@ type ContainerState struct {
 	DesiredNetwork string
 	CreatedAt      string
 	Config		   container.Config
+	Host		   container.HostConfig
 }