This commit is contained in:
iwilltry42 2019-07-08 09:58:26 +02:00
parent 93fa5630ac
commit f670dde640
2 changed files with 45 additions and 16 deletions

View File

@ -14,8 +14,7 @@ import (
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/filters"
"github.com/docker/docker/client"
"github.com/mitchellh/go-homedir"
homedir "github.com/mitchellh/go-homedir"
"github.com/olekukonko/tablewriter"
)

View File

@ -6,15 +6,15 @@ import (
"io"
"io/ioutil"
"log"
"os"
"strings"
"time"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/network"
"github.com/docker/docker/client"
)
const imageBasePathRemote = "/images/"
const imageBasePathRemote = "/images"
func importImage(clusterName string, images []string) error {
// get a docker client
@ -29,7 +29,6 @@ func importImage(clusterName string, images []string) error {
if err != nil {
return fmt.Errorf("ERROR: couldn't get image volume for cluster [%s]\n%+v", clusterName, err)
}
imageBasePathLocal := imageVolume.Mountpoint + "/"
//*** first, save the images using the local docker daemon
log.Printf("INFO: Saving images [%s] from local docker daemon...", images)
@ -38,17 +37,44 @@ func importImage(clusterName string, images []string) error {
return fmt.Errorf("ERROR: failed to save images [%s] locally\n%+v", images, err)
}
// create tarball
imageTarName := "k3d-" + clusterName + "-images-" + time.Now().Format("20060102150405") + ".tar"
imageTar, err := os.Create(imageBasePathLocal + imageTarName)
// TODO: create tar from stream
tmpFile, err := ioutil.TempFile("", "*.tar")
if err != nil {
return err
return fmt.Errorf("ERROR: couldn't create temp file to cache tarball\n%+v", err)
}
defer tmpFile.Close()
if _, err = io.Copy(tmpFile, imageReader); err != nil {
return fmt.Errorf("ERROR: couldn't write image stream to tar [%s]\n%+v", tmpFile.Name(), err)
}
defer imageTar.Close()
_, err = io.Copy(imageTar, imageReader)
// create a dummy container to get the tarball into the named volume
containerConfig := container.Config{
Hostname: "k3d-dummy", // TODO: change details here
Image: "rancher/k3s:v0.7.0-rc2",
Labels: map[string]string{
"app": "k3d",
"cluster": "test",
},
}
hostConfig := container.HostConfig{
Binds: []string{
fmt.Sprintf("%s:%s:rw", imageVolume.Name, imageBasePathRemote),
},
}
dummyContainer, err := docker.ContainerCreate(ctx, &containerConfig, &hostConfig, &network.NetworkingConfig{}, "k3d-dummy")
if err != nil {
return fmt.Errorf("ERROR: couldn't save image [%s] to file [%s]\n%+v", images, imageTar.Name(), err)
return fmt.Errorf("ERROR: couldn't create dummy container\n%+v", err)
}
fmt.Println(ioutil.ReadAll(imageReader))
if err = docker.CopyToContainer(ctx, dummyContainer.ID, "/images", imageReader, types.CopyToContainerOptions{}); err != nil {
return fmt.Errorf("ERROR: couldn't copy tarball to dummy container\n%+v", err)
}
if err = docker.ContainerRemove(ctx, "k3d-dummy", types.ContainerRemoveOptions{
Force: true,
}); err != nil {
return fmt.Errorf("ERROR: couldn't remove dummy container\n%+v", err)
}
// Get the container IDs for all containers in the cluster
@ -62,7 +88,8 @@ func importImage(clusterName string, images []string) error {
// *** second, import the images using ctr in the k3d nodes
// create exec configuration
cmd := []string{"ctr", "image", "import", imageBasePathRemote + imageTarName}
command := fmt.Sprintf("ctr image import %s", imageBasePathRemote+"/test.tar")
cmd := []string{"sh", "-c", command}
execConfig := types.ExecConfig{
AttachStderr: true,
AttachStdout: true,
@ -120,9 +147,12 @@ func importImage(clusterName string, images []string) error {
log.Printf("INFO: Successfully imported image [%s] in all nodes of cluster [%s]", images, clusterName)
log.Println("INFO: Cleaning up tarball...")
if err := os.Remove(imageBasePathLocal + imageTarName); err != nil {
return fmt.Errorf("ERROR: Couldn't remove tarball [%s]\n%+v", imageBasePathLocal+imageTarName, err)
/*if err := tmpFile.Close(); err != nil {
return fmt.Errorf("ERROR: Couldn't close tarfile [%s]\n%+v", tmpFile.Name(), err)
}
if err = os.Remove(tmpFile.Name()); err != nil {
return fmt.Errorf("ERROR: Couldn't remove tarball [%s]\n%+v", tmpFile.Name(), err)
}*/
log.Println("INFO: ...Done")
return nil