This repository has been archived on 2023-05-06. You can view files and clone it, but cannot push or open issues or pull requests.
helix/internal/docker/container.go

94 lines
2.5 KiB
Go

package docker
import (
"fmt"
"github.com/pulumi/pulumi-docker/sdk/v3/go/docker"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
// DockerContainerInput is the configuration
// used to create the Gitea docker container.
type DockerContainerInput struct {
Image pulumi.StringInput
Ipv4Address pulumi.StringInput
EnvVars pulumi.StringArray
Name pulumi.StringInput
Network pulumi.StringInput
HostPathVolumes []HostPathVolume
DockerVolumes []DockerVolume
UniqueLabel string
}
// HostPathVolume is the configuration
// used for mounting a host directory
// to a directory inside a container.
type HostPathVolume struct {
HostPath pulumi.StringInput
MountPath pulumi.StringInput
}
// DockerVolume is the configuration
// used for mounting a docker volume
// to a directory inside a container.
type DockerVolume struct {
Name pulumi.StringInput
MountPath pulumi.StringInput
}
// CreateContainer creates and runs a new container.
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{
docker.ContainerVolumeArgs{
ContainerPath: pulumi.String("/etc/timezone"),
HostPath: pulumi.String("/etc/timezone"),
ReadOnly: pulumi.BoolPtr(true),
},
docker.ContainerVolumeArgs{
ContainerPath: pulumi.String("/etc/localtime"),
HostPath: pulumi.String("/etc/localtime"),
ReadOnly: pulumi.BoolPtr(true),
},
}
// create additional container volumes if specified.
for _, v := range c.HostPathVolumes {
arg := docker.ContainerVolumeArgs{
ContainerPath: v.MountPath,
HostPath: v.HostPath,
}
volumes = append(volumes, arg)
}
for _, v := range c.DockerVolumes {
arg := docker.ContainerVolumeArgs{
ContainerPath: v.MountPath,
VolumeName: v.Name,
}
volumes = append(volumes, arg)
}
args := docker.ContainerArgs{
Envs: c.EnvVars,
Image: c.Image,
Hostname: c.Name,
Name: c.Name,
NetworksAdvanced: docker.ContainerNetworksAdvancedArray{
docker.ContainerNetworksAdvancedArgs{
Name: c.Network,
Ipv4Address: c.Ipv4Address,
},
},
Restart: pulumi.String("unless-stopped"),
Volumes: docker.ContainerVolumeArray(volumes),
}
_, err := docker.NewContainer(ctx, fmt.Sprintf("%s_container", c.UniqueLabel), &args)
if err != nil {
return fmt.Errorf("unable to create the Docker container for %s...\n%w", c.UniqueLabel, err)
}
return nil
}