feat: create a shared volume
The shared volume will be used by each container to share their specific traefik dynamic configuration to allow Traefik to dynamically configure the backend.
This commit is contained in:
parent
99cf3dca17
commit
2a761272a0
8 changed files with 78 additions and 18 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
helix
|
|
@ -6,28 +6,34 @@ import (
|
|||
"io/ioutil"
|
||||
)
|
||||
|
||||
// Config is the whole configuration for the forge platform deployment.
|
||||
type Config struct {
|
||||
ProjectName string `json:"project"`
|
||||
Docker DockerConfig `json:"docker"`
|
||||
Services ServicesConfig `json:"services"`
|
||||
}
|
||||
|
||||
// DockerConfig contains the configuration for
|
||||
// docker specific components.
|
||||
// DockerConfig contains the configuration for docker specific components.
|
||||
type DockerConfig struct {
|
||||
Network DockerNetworkConfig `json:"network"`
|
||||
Network DockerNetworkConfig `json:"network"`
|
||||
SharedVolume DockerSharedVolumeConfig `json:"sharedVolume"`
|
||||
}
|
||||
|
||||
// DockerNetworkStackArgs contains arguments for
|
||||
// creating the DockerNetworkStack
|
||||
// DockerNetworkConfig contains configuration for creating the docker network.
|
||||
|
||||
type DockerNetworkConfig struct {
|
||||
Name string `json:"name"`
|
||||
Subnet string `json:"subnet"`
|
||||
Driver string `json:"driver"`
|
||||
}
|
||||
|
||||
// Services contains a list of
|
||||
// services and their configuration
|
||||
// DockerSharedVolumeConfig contains configuration
|
||||
// for creating the shared volume.
|
||||
type DockerSharedVolumeConfig struct {
|
||||
Name string `json:"name"`
|
||||
}
|
||||
|
||||
// Services contains a list of services and their configuration.
|
||||
type ServicesConfig struct {
|
||||
Traefik TraefikConfig `json:"traefik"`
|
||||
}
|
||||
|
|
|
@ -23,6 +23,9 @@ func TestValidConfig(t *testing.T) {
|
|||
Subnet: "172.17.1.0/24",
|
||||
Driver: "default",
|
||||
},
|
||||
SharedVolume: DockerSharedVolumeConfig{
|
||||
Name: "shared-volume",
|
||||
},
|
||||
},
|
||||
Services: ServicesConfig{
|
||||
Traefik: TraefikConfig{
|
||||
|
|
3
internal/config/testdata/config-valid.json
vendored
3
internal/config/testdata/config-valid.json
vendored
|
@ -5,6 +5,9 @@
|
|||
"subnet": "172.17.1.0/24",
|
||||
"name": "forge-platform-test-netwwork",
|
||||
"driver": "default"
|
||||
},
|
||||
"sharedVolume": {
|
||||
"name": "shared-volume"
|
||||
}
|
||||
},
|
||||
"services": {
|
||||
|
|
|
@ -27,7 +27,7 @@ type DockerVolumeMount struct {
|
|||
MountPath pulumi.StringInput
|
||||
}
|
||||
|
||||
func CreateDockerContainer(ctx *pulumi.Context, c DockerContainerInput) error {
|
||||
func CreateContainer(ctx *pulumi.Context, c DockerContainerInput) error {
|
||||
// all containers will mount the host's timezone and localtime files
|
||||
// to ensure the correct time is synced.
|
||||
volumes := []docker.ContainerVolumeInput{
|
||||
|
|
|
@ -25,7 +25,7 @@ type DockerImageOutput struct {
|
|||
}
|
||||
|
||||
// CreateDockerImage creates a local Docker image.
|
||||
func CreateDockerImage(ctx *pulumi.Context, c DockerImageInput) (DockerImageOutput, error) {
|
||||
func CreateImage(ctx *pulumi.Context, c DockerImageInput) (DockerImageOutput, error) {
|
||||
var output DockerImageOutput
|
||||
|
||||
args := docker.ImageArgs{
|
||||
|
|
36
internal/docker/volume.go
Normal file
36
internal/docker/volume.go
Normal file
|
@ -0,0 +1,36 @@
|
|||
package docker
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/pulumi/pulumi-docker/sdk/v3/go/docker"
|
||||
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
|
||||
)
|
||||
|
||||
type DockerVolumeInput struct {
|
||||
Name pulumi.StringInput
|
||||
UniqueLabel string
|
||||
}
|
||||
|
||||
type DockerVolumeOutput struct {
|
||||
Name pulumi.StringOutput
|
||||
}
|
||||
|
||||
func CreateVolume(ctx *pulumi.Context, input DockerVolumeInput) (DockerVolumeOutput, error) {
|
||||
var output DockerVolumeOutput
|
||||
|
||||
args := docker.VolumeArgs{
|
||||
Name: input.Name,
|
||||
}
|
||||
|
||||
volume, err := docker.NewVolume(ctx, input.UniqueLabel, &args)
|
||||
if err != nil {
|
||||
return output, fmt.Errorf("unable to create the %s volume...\n%v", input.UniqueLabel, err)
|
||||
}
|
||||
|
||||
output = DockerVolumeOutput{
|
||||
Name: volume.Name,
|
||||
}
|
||||
|
||||
return output, nil
|
||||
}
|
|
@ -31,7 +31,7 @@ var templateTraefikStaticConfig string
|
|||
|
||||
// newContainerStack creates the ContainerStack value.
|
||||
func newDockerStack(ctx context.Context, project, stack string, c config.Config) (*DockerStack, error) {
|
||||
deployFunc := deployDockerStack(project, c.Docker.Network, c.Services)
|
||||
deployFunc := deployDockerStack(project, c.Docker, c.Services)
|
||||
|
||||
s, err := createOrSelectStack(ctx, project, stack, deployFunc)
|
||||
if err != nil {
|
||||
|
@ -78,18 +78,29 @@ func (c *DockerStack) Destroy(ctx context.Context) error {
|
|||
|
||||
// deployDockerStack returns a Pulumi run function
|
||||
// that is used to deploy the docker stack.
|
||||
func deployDockerStack(project string, network config.DockerNetworkConfig, services config.ServicesConfig) pulumi.RunFunc {
|
||||
func deployDockerStack(project string, dockerConfig config.DockerConfig, services config.ServicesConfig) pulumi.RunFunc {
|
||||
return func(ctx *pulumi.Context) error {
|
||||
// TODO: Create the provider when we start playing with remote hosts
|
||||
|
||||
// Create the docker network
|
||||
config := docker.DockerNetworkConfig{
|
||||
Name: pulumi.String(network.Name),
|
||||
Subnet: pulumi.String(network.Subnet),
|
||||
Driver: pulumi.String(network.Driver),
|
||||
networkConfig := docker.DockerNetworkConfig{
|
||||
Name: pulumi.String(dockerConfig.Network.Name),
|
||||
Subnet: pulumi.String(dockerConfig.Network.Subnet),
|
||||
Driver: pulumi.String(dockerConfig.Network.Driver),
|
||||
}
|
||||
|
||||
network, err := docker.CreateNetwork(ctx, config)
|
||||
network, err := docker.CreateNetwork(ctx, networkConfig)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Create the shared volume
|
||||
sharedVolumeInput := docker.DockerVolumeInput{
|
||||
Name: pulumi.String(dockerConfig.SharedVolume.Name),
|
||||
UniqueLabel: "shared",
|
||||
}
|
||||
|
||||
_, err = docker.CreateVolume(ctx, sharedVolumeInput)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -122,7 +133,7 @@ func deployDockerStack(project string, network config.DockerNetworkConfig, servi
|
|||
UniqueLabel: "traefik-image",
|
||||
}
|
||||
|
||||
traefikImage, err := docker.CreateDockerImage(ctx, c)
|
||||
traefikImage, err := docker.CreateImage(ctx, c)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -135,7 +146,7 @@ func deployDockerStack(project string, network config.DockerNetworkConfig, servi
|
|||
UniqueLabel: "traefik-container",
|
||||
}
|
||||
|
||||
if err = docker.CreateDockerContainer(ctx, traefikContainerInput); err != nil {
|
||||
if err = docker.CreateContainer(ctx, traefikContainerInput); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
Reference in a new issue