mirror of https://github.com/k3d-io/k3d
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
1.9 KiB
77 lines
1.9 KiB
6 years ago
|
package run
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"io"
|
||
|
"log"
|
||
|
"os"
|
||
|
"time"
|
||
|
|
||
|
"github.com/docker/go-connections/nat"
|
||
|
|
||
|
"github.com/docker/docker/api/types"
|
||
|
"github.com/docker/docker/api/types/container"
|
||
|
"github.com/docker/docker/client"
|
||
|
)
|
||
|
|
||
|
func createServer(verbose bool, image string, port string, args []string, env []string, name string, volumes []string) (string, error) {
|
||
|
ctx := context.Background()
|
||
|
docker, err := client.NewEnvClient()
|
||
|
if err != nil {
|
||
|
return "", fmt.Errorf("ERROR: couldn't create docker client\n%+v", err)
|
||
|
}
|
||
|
|
||
|
reader, err := docker.ImagePull(ctx, image, types.ImagePullOptions{})
|
||
|
if err != nil {
|
||
|
return "", fmt.Errorf("ERROR: couldn't pull image %s\n%+v", image, err)
|
||
|
}
|
||
|
if verbose {
|
||
|
_, err := io.Copy(os.Stdout, reader) // TODO: only if verbose mode
|
||
|
if err != nil {
|
||
|
log.Printf("WARNING: couldn't get docker output\n%+v", err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
containerLabels := make(map[string]string)
|
||
|
containerLabels["app"] = "k3d"
|
||
|
containerLabels["component"] = "server"
|
||
|
containerLabels["created"] = time.Now().Format("2006-01-02 15:04:05")
|
||
|
containerLabels["cluster"] = name
|
||
|
|
||
|
containerName := fmt.Sprintf("%s-server", name)
|
||
|
|
||
|
containerPort := nat.Port(fmt.Sprintf("%s/tcp", port))
|
||
|
|
||
|
resp, err := docker.ContainerCreate(ctx, &container.Config{
|
||
|
Image: image,
|
||
|
Cmd: append([]string{"server"}, args...),
|
||
|
ExposedPorts: nat.PortSet{
|
||
|
containerPort: struct{}{},
|
||
|
},
|
||
|
Env: env,
|
||
|
Labels: containerLabels,
|
||
|
}, &container.HostConfig{
|
||
|
Binds: volumes,
|
||
|
PortBindings: nat.PortMap{
|
||
|
containerPort: []nat.PortBinding{
|
||
|
{
|
||
|
HostIP: "0.0.0.0",
|
||
|
HostPort: port,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
Privileged: true,
|
||
|
}, nil, containerName)
|
||
|
if err != nil {
|
||
|
return "", fmt.Errorf("ERROR: couldn't create container %s\n%+v", containerName, err)
|
||
|
}
|
||
|
|
||
|
if err := docker.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
|
||
|
return "", fmt.Errorf("ERROR: couldn't start container %s\n%+v", containerName, err)
|
||
|
}
|
||
|
|
||
|
return resp.ID, nil
|
||
|
|
||
|
}
|