mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
1f61084d83
Some structures use int for sizes and UNIX timestamps. On some platforms, int is 32 bits, so this can lead to the year 2038 issues and overflows when dealing with large containers or layers. Consistently use int64 to store sizes and UNIX timestamps in api/types/types.go. Update related to code accordingly (i.e. strconv.FormatInt instead of strconv.Itoa). Use int64 in progressreader package to avoid integer overflow when dealing with large quantities. Update related code accordingly. Signed-off-by: Aaron Lehmann <aaron.lehmann@docker.com>
75 lines
1.9 KiB
Go
75 lines
1.9 KiB
Go
package graph
|
|
|
|
import (
|
|
"io"
|
|
"net/http"
|
|
"net/url"
|
|
|
|
"github.com/docker/docker/pkg/archive"
|
|
"github.com/docker/docker/pkg/httputils"
|
|
"github.com/docker/docker/pkg/progressreader"
|
|
"github.com/docker/docker/pkg/streamformatter"
|
|
"github.com/docker/docker/runconfig"
|
|
"github.com/docker/docker/utils"
|
|
)
|
|
|
|
// Import imports an image, getting the archived layer data either from
|
|
// inConfig (if src is "-"), or from a URI specified in src. Progress output is
|
|
// written to outStream. Repository and tag names can optionally be given in
|
|
// the repo and tag arguments, respectively.
|
|
func (s *TagStore) Import(src string, repo string, tag string, inConfig io.ReadCloser, outStream io.Writer, containerConfig *runconfig.Config) error {
|
|
var (
|
|
sf = streamformatter.NewJSONStreamFormatter()
|
|
archive archive.ArchiveReader
|
|
resp *http.Response
|
|
)
|
|
|
|
if src == "-" {
|
|
archive = inConfig
|
|
} else {
|
|
u, err := url.Parse(src)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if u.Scheme == "" {
|
|
u.Scheme = "http"
|
|
u.Host = src
|
|
u.Path = ""
|
|
}
|
|
outStream.Write(sf.FormatStatus("", "Downloading from %s", u))
|
|
resp, err = httputils.Download(u.String())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
progressReader := progressreader.New(progressreader.Config{
|
|
In: resp.Body,
|
|
Out: outStream,
|
|
Formatter: sf,
|
|
Size: resp.ContentLength,
|
|
NewLines: true,
|
|
ID: "",
|
|
Action: "Importing",
|
|
})
|
|
defer progressReader.Close()
|
|
archive = progressReader
|
|
}
|
|
|
|
img, err := s.graph.Create(archive, "", "", "Imported from "+src, "", nil, containerConfig)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
// Optionally register the image at REPO/TAG
|
|
if repo != "" {
|
|
if err := s.Tag(repo, tag, img.ID, true); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
outStream.Write(sf.FormatStatus("", img.ID))
|
|
logID := img.ID
|
|
if tag != "" {
|
|
logID = utils.ImageReference(logID, tag)
|
|
}
|
|
|
|
s.eventsService.Log("import", logID, "")
|
|
return nil
|
|
}
|