func runDownload(args *docopt.Args) error { if err := os.MkdirAll(args.String["--root"], 0755); err != nil { return fmt.Errorf("error creating root dir: %s", err) } // create a TUF client and update it tufDB := args.String["--tuf-db"] local, err := tuf.FileLocalStore(tufDB) if err != nil { return err } remote, err := tuf.HTTPRemoteStore(args.String["--repository"], tufHTTPOpts("downloader")) if err != nil { return err } client := tuf.NewClient(local, remote) if err := updateTUFClient(client); err != nil { return err } // pull images from the TUF repo if err := pinkerton.PullImagesWithClient( client, args.String["--repository"], args.String["--driver"], args.String["--root"], pinkerton.InfoPrinter(false), ); err != nil { return err } // download the upstart config and image manifests if err := os.MkdirAll(args.String["--config-dir"], 0755); err != nil { return fmt.Errorf("error creating config dir: %s", err) } for _, path := range []string{"/upstart.conf", "/bootstrap-manifest.json"} { if _, err := downloadGzippedFile(client, path, args.String["--config-dir"]); err != nil { return err } } // download the init and cli binaries if err := os.MkdirAll(args.String["--bin-dir"], 0755); err != nil { return fmt.Errorf("error creating bin dir: %s", err) } for _, path := range []string{"/flynn-linux-amd64", "/flynn-init", "/flynn-nsumount"} { dst, err := downloadGzippedFile(client, path, args.String["--bin-dir"]) if err != nil { return err } if err := os.Chmod(dst, 0755); err != nil { return err } } return nil }
func main() { usage := `Pinkerton manages Docker images. Usage: pinkerton pull [options] <image-url> pinkerton checkout [options] <id> <image-id> pinkerton cleanup [options] <id> pinkerton -h | --help Commands: pull Download a Docker image checkout Create a working copy of an image cleanup Destroy a working copy of an image Examples: pinkerton pull https://registry.hub.docker.com/redis pinkerton pull https://registry.hub.docker.com/ubuntu?tag=trusty pinkerton pull https://registry.hub.docker.com/flynn/slugrunner?id=1443bd6a675b959693a1a4021d660bebbdbff688d00c65ff057c46702e4b8933 pinkerton checkout slugrunner-test 1443bd6a675b959693a1a4021d660bebbdbff688d00c65ff057c46702e4b8933 pinkerton cleanup slugrunner-test Options: -h, --help show this message and exit --driver=<name> storage driver [default: aufs] --root=<path> storage root [default: /var/lib/docker] --json emit json-formatted output ` args, _ := docopt.Parse(usage, nil, true, "", false) ctx, err := pinkerton.BuildContext(args.String["--driver"], args.String["--root"]) if err != nil { log.Fatal(err) } switch { case args.Bool["pull"]: if err := ctx.Pull(args.String["<image-url>"], pinkerton.InfoPrinter(args.Bool["--json"])); err != nil { log.Fatal(err) } case args.Bool["checkout"]: path, err := ctx.Checkout(args.String["<id>"], args.String["<image-id>"]) if err != nil { log.Fatal(err) } fmt.Println(path) case args.Bool["cleanup"]: if err := ctx.Cleanup(args.String["<id>"]); err != nil { log.Fatal(err) } } }
func runDownload(args *docopt.Args) error { if err := os.MkdirAll(args.String["--root"], 0755); err != nil { return fmt.Errorf("error creating root dir: %s", err) } // create a TUF client and update it tufDB := args.String["--tuf-db"] local, err := tuf.FileLocalStore(tufDB) if err != nil { return err } remote, err := tuf.HTTPRemoteStore(args.String["--repository"], tufHTTPOpts("downloader")) if err != nil { return err } client := tuf.NewClient(local, remote) if err := updateTUFClient(client); err != nil { return err } // pull images from the TUF repo if err := pinkerton.PullImagesWithClient( client, args.String["--repository"], args.String["--driver"], args.String["--root"], pinkerton.InfoPrinter(false), ); err != nil { return err } if _, err := downloader.DownloadConfig(client, args.String["--config-dir"]); err != nil { return err } if _, err := downloader.DownloadBinaries(client, args.String["--bin-dir"]); err != nil { return err } return nil }
func runDownload(args *docopt.Args) error { if err := os.MkdirAll(args.String["--root"], 0755); err != nil { return fmt.Errorf("error creating root dir: %s", err) } var manifest map[string]string if err := cliutil.DecodeJSONArg(args.String["<manifest>"], &manifest); err != nil { return err } ctx, err := pinkerton.BuildContext(args.String["--driver"], args.String["--root"]) if err != nil { return err } for image, id := range manifest { fmt.Printf("Downloading %s %s...\n", image, id) image += "?id=" + id if err := ctx.Pull(image, pinkerton.InfoPrinter(false)); err != nil { return err } } return nil }
func runDownload(args *docopt.Args) error { if err := os.MkdirAll(args.String["--root"], 0755); err != nil { return fmt.Errorf("error creating root dir: %s", err) } log := log15.New() // create a TUF client and update it log.Info("initializing TUF client") tufDB := args.String["--tuf-db"] local, err := tuf.FileLocalStore(tufDB) if err != nil { log.Error("error creating local TUF client", "err", err) return err } remote, err := tuf.HTTPRemoteStore(args.String["--repository"], tufHTTPOpts("downloader")) if err != nil { log.Error("error creating remote TUF client", "err", err) return err } client := tuf.NewClient(local, remote) if err := updateTUFClient(client); err != nil { log.Error("error updating TUF client", "err", err) return err } configDir := args.String["--config-dir"] version := os.Getenv("FLYNN_VERSION") if version == "" { version, err = getChannelVersion(configDir, client, log) if err != nil { return err } } log.Info(fmt.Sprintf("downloading components with version %s", version)) log.Info("downloading images") if err := pinkerton.PullImagesWithClient( client, args.String["--repository"], args.String["--driver"], args.String["--root"], version, pinkerton.InfoPrinter(false), ); err != nil { return err } d := downloader.New(client, version) log.Info(fmt.Sprintf("downloading config to %s", configDir)) if _, err := d.DownloadConfig(configDir); err != nil { log.Error("error downloading config", "err", err) return err } binDir := args.String["--bin-dir"] log.Info(fmt.Sprintf("downloading binaries to %s", binDir)) if _, err := d.DownloadBinaries(binDir); err != nil { log.Error("error downloading binaries", "err", err) return err } log.Info("download complete") return nil }