diff --git a/pkg/agent/config/config.go b/pkg/agent/config/config.go index c91d038f87cc..bd30229cbf0c 100644 --- a/pkg/agent/config/config.go +++ b/pkg/agent/config/config.go @@ -161,6 +161,7 @@ func get(envInfo *cmds.Agent) (*config.Node, error) { ContainerRuntimeEndpoint: envInfo.ContainerRuntimeEndpoint, } nodeConfig.LocalAddress = localAddress(controlConfig) + nodeConfig.Images = filepath.Join(envInfo.DataDir, "images") nodeConfig.AgentConfig.NodeIP = nodeIP nodeConfig.AgentConfig.NodeName = nodeName nodeConfig.AgentConfig.ClusterDNS = controlConfig.ClusterDNS diff --git a/pkg/agent/containerd/containerd.go b/pkg/agent/containerd/containerd.go index 5b5b8ca948ab..58c0ad39afc8 100644 --- a/pkg/agent/containerd/containerd.go +++ b/pkg/agent/containerd/containerd.go @@ -3,9 +3,13 @@ package containerd import ( "context" "fmt" + "github.com/containerd/containerd" + "github.com/containerd/containerd/namespaces" "io" + "io/ioutil" "os" "os/exec" + "path/filepath" "strings" "syscall" "time" @@ -122,5 +126,40 @@ func Run(ctx context.Context, cfg *config.Node) error { } } + fileInfo, err := os.Stat(cfg.Images) + if err != nil { + logrus.Infof("Cannot find images in %s: %v", cfg.Images, err) + } else { + if fileInfo.IsDir() { + fileInfos, err := ioutil.ReadDir(cfg.Images) + if err != nil { + logrus.Infof("Cannot read images in %s: %v", cfg.Images, err) + } + client, err := containerd.New(cfg.Containerd.Address) + if err != nil { + return err + } + defer client.Close() + + ctxContainerD := namespaces.WithNamespace(context.Background(), "k8s.io") + + for _, fileInfo := range fileInfos { + if !fileInfo.IsDir() { + filePath := filepath.Join(cfg.Images, fileInfo.Name()) + file, err := os.Open(filePath) + if err != nil { + logrus.Errorf("Unable to read %s: %v", filePath, err) + continue + } + logrus.Debugf("Import %s", filePath) + _, err = client.Import(ctxContainerD, file) + if err != nil { + logrus.Errorf("Unable to import %s: %v", filePath, err) + } + } + } + } + } + return nil } diff --git a/pkg/daemons/config/types.go b/pkg/daemons/config/types.go index a8deb6abca09..78a6a0f5a39a 100644 --- a/pkg/daemons/config/types.go +++ b/pkg/daemons/config/types.go @@ -16,6 +16,7 @@ type Node struct { FlannelConf string LocalAddress string Containerd Containerd + Images string AgentConfig Agent CACerts []byte ServerAddress string