Skip to content
This repository was archived by the owner on Mar 24, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
144 changes: 144 additions & 0 deletions cmd/rig/cmd/dev/docker/create.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
package docker

import (
"context"
_ "embed"
"fmt"
"os"
"os/exec"

"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/mount"
"github.com/docker/docker/api/types/network"
"github.com/docker/docker/api/types/volume"
"github.com/docker/docker/client"
"github.com/docker/go-connections/nat"
v1 "github.com/opencontainers/image-spec/specs-go/v1"
"github.com/rigdev/rig/cmd/common"
"github.com/spf13/cobra"
)

func (c Cmd) create(cmd *cobra.Command, args []string) error {
ctx := c.Ctx

v, err := c.DockerClient.VolumeCreate(ctx, volume.CreateOptions{
Name: "rig-platform-postgres-data",
})
if err != nil {
return err
}

if err := c.ensureContainer(ctx, &container.Config{
Image: "postgres:latest",
Env: []string{
"POSTGRES_DB=rig",
"POSTGRES_USER=postgres",
"POSTGRES_PASSWORD=postgres",
},
}, &container.HostConfig{
Mounts: []mount.Mount{
{
Type: mount.TypeVolume,
Source: v.Name,
Target: "/var/lib/postgresql/data",
},
},
}, "rig-platform-postgres"); err != nil {
return err
}

if err := c.ensureContainer(ctx, &container.Config{
Image: fmt.Sprint("ghcr.io/rigdev/rig-platform:", platformDockerTag),
Env: []string{
"RIG_CLIENT_POSTGRES_HOST=rig-platform-postgres:5432",
"RIG_CLIENT_POSTGRES_USER=postgres",
"RIG_CLIENT_POSTGRES_PASSWORD=postgres",
"RIG_CLIENT_POSTGRES_INSECURE=true",
"RIG_AUTH_JWT_SECRET=shhhdonotshare",
"REPOSITORY_SECRET_POSTGRES_KEY=thisisasecret",
},
ExposedPorts: nat.PortSet{
"4747/tcp": struct{}{},
},
}, &container.HostConfig{
PortBindings: nat.PortMap{
"4747/tcp": []nat.PortBinding{{
HostIP: "127.0.0.1",
HostPort: "4747",
}},
},
Mounts: []mount.Mount{
{
Type: mount.TypeBind,
Source: "/var/run/docker.sock",
Target: "/var/run/docker.sock",
},
},
}, "rig-platform"); err != nil {
return err
}

fmt.Printf("Running init command:\n")
initCmd := exec.CommandContext(ctx, "docker", "exec", "-it", "-eRIG_LOGGING_LEVEL=warn", "rig-platform", "rig-admin", "init")
initCmd.Stdin = os.Stdin
initCmd.Stdout = os.Stdout
initCmd.Stderr = os.Stderr

return initCmd.Run()
}

func (c Cmd) ensureContainer(ctx context.Context, cc *container.Config, chc *container.HostConfig, containerName string) error {
create := true
if _, err := c.DockerClient.ContainerInspect(ctx, containerName); client.IsErrNotFound(err) {
} else if err != nil {
return err
} else {
ok, err := common.PromptConfirm(fmt.Sprint("Container `", containerName, "` already exists, re-create?"), false)
if err != nil {
return err
}

if ok {
if err := c.DockerClient.ContainerRemove(ctx, containerName, types.ContainerRemoveOptions{
Force: true,
}); err != nil {
return err
}
} else {
create = false
}
}

if create {
fmt.Printf("Starting container `%s`... ", containerName)
if _, err := c.DockerClient.NetworkInspect(ctx, "rig", types.NetworkInspectOptions{}); client.IsErrNotFound(err) {
if _, err := c.DockerClient.NetworkCreate(ctx, "rig", types.NetworkCreate{
CheckDuplicate: true,
}); err != nil {
return err
}
} else if err != nil {
return err
}

_, err := c.DockerClient.ContainerCreate(ctx, cc, chc, &network.NetworkingConfig{
EndpointsConfig: map[string]*network.EndpointSettings{
"rig": {
Aliases: []string{containerName},
},
},
}, &v1.Platform{}, containerName)
if err != nil {
return err
}

fmt.Printf("OK\n")
}

if err := c.DockerClient.ContainerStart(ctx, containerName, types.ContainerStartOptions{}); err != nil {
return err
}

return nil
}
45 changes: 45 additions & 0 deletions cmd/rig/cmd/dev/docker/setup.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package docker

import (
"context"

"github.com/docker/docker/client"
"github.com/rigdev/rig-go-sdk"
"github.com/rigdev/rig/cmd/rig/cmd/base"
"github.com/rigdev/rig/cmd/rig/cmd/cmd_config"
"github.com/spf13/cobra"
"go.uber.org/fx"
)

var platformDockerTag string

type Cmd struct {
fx.In

Ctx context.Context
DockerClient *client.Client
Rig rig.Client
Cfg *cmd_config.Config
}

func (c *Cmd) Setup(parent *cobra.Command) {
docker := &cobra.Command{
Use: "docker",
Short: "The docker command is used to setup and manage a development Docker cluster running Rig",
}

create := &cobra.Command{
Use: "create",
Short: "Create a Rig cluster in Docker for local development",
Args: cobra.NoArgs,
RunE: c.create,
Annotations: map[string]string{
base.OmitUser: "",
base.OmitProject: "",
},
}
create.Flags().StringVarP(&platformDockerTag, "platform-docker-tag", "p", "latest", "The rig-platform docker image tag. Defaults to latest.")
docker.AddCommand(create)

parent.AddCommand(docker)
}
5 changes: 4 additions & 1 deletion cmd/rig/cmd/dev/setup.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dev

import (
"github.com/rigdev/rig/cmd/rig/cmd/dev/docker"
"github.com/rigdev/rig/cmd/rig/cmd/dev/kind"
"github.com/spf13/cobra"
"go.uber.org/fx"
Expand All @@ -9,7 +10,8 @@ import (
type Cmd struct {
fx.In

Kind kind.Cmd
Kind kind.Cmd
Docker docker.Cmd
}

func (d *Cmd) Setup(parent *cobra.Command) {
Expand All @@ -18,6 +20,7 @@ func (d *Cmd) Setup(parent *cobra.Command) {
}

d.Kind.Setup(dev)
d.Docker.Setup(dev)

parent.AddCommand(dev)
}