// PlatformAdd build and push a new docker platform to register func (p *dockerProvisioner) PlatformAdd(name string, args map[string]string, w io.Writer) error { if args["dockerfile"] == "" { return errors.New("Dockerfile is required.") } if _, err := url.ParseRequestURI(args["dockerfile"]); err != nil { return errors.New("dockerfile parameter should be an url.") } imageName := platformImageName(name) cluster := p.Cluster() buildOptions := docker.BuildImageOptions{ Name: imageName, NoCache: true, RmTmpContainer: true, Remote: args["dockerfile"], InputStream: nil, OutputStream: w, } err := cluster.BuildImage(buildOptions) if err != nil { return err } parts := strings.Split(imageName, ":") var tag string if len(parts) > 2 { imageName = strings.Join(parts[:len(parts)-1], ":") tag = parts[len(parts)-1] } else if len(parts) > 1 { imageName = parts[0] tag = parts[1] } else { imageName = parts[0] tag = "latest" } return p.PushImage(imageName, tag) }
func (p *dockerProvisioner) buildPlatform(name string, args map[string]string, w io.Writer, r io.Reader) error { var inputStream io.Reader var dockerfileURL string if r != nil { data, err := ioutil.ReadAll(r) if err != nil { return err } var buf bytes.Buffer writer := tar.NewWriter(&buf) writer.WriteHeader(&tar.Header{ Name: "Dockerfile", Mode: 0644, Size: int64(len(data)), }) writer.Write(data) writer.Close() inputStream = &buf } else { dockerfileURL = args["dockerfile"] if dockerfileURL == "" { return errors.New("Dockerfile is required") } if _, err := url.ParseRequestURI(dockerfileURL); err != nil { return errors.New("dockerfile parameter must be a URL") } } imageName := image.PlatformImageName(name) cluster := p.Cluster() buildOptions := docker.BuildImageOptions{ Name: imageName, Pull: true, NoCache: true, RmTmpContainer: true, Remote: dockerfileURL, InputStream: inputStream, OutputStream: w, InactivityTimeout: net.StreamInactivityTimeout, RawJSONStream: true, } err := cluster.BuildImage(buildOptions) if err != nil { return err } parts := strings.Split(imageName, ":") var tag string if len(parts) > 2 { imageName = strings.Join(parts[:len(parts)-1], ":") tag = parts[len(parts)-1] } else if len(parts) > 1 { imageName = parts[0] tag = parts[1] } else { imageName = parts[0] tag = "latest" } return p.PushImage(imageName, tag) }
func (p *dockerProvisioner) BuildImageWithDockerfile(app provision.App, archiveFile io.Reader, w io.Writer) (string, error) { cluster := p.Cluster() archive, err := gzip.NewReader(archiveFile) if err != nil { return "", err } defer archive.Close() imageName := app.GetName() + randomString() buildOpts := docker.BuildImageOptions{ Name: imageName, NoCache: true, RmTmpContainer: true, InputStream: archive, OutputStream: w, } err = cluster.BuildImage(buildOpts) return imageName, err }