|
@@ -381,7 +381,7 @@ func (s *Server) getImagesJSON(eng *engine.Engine, version version.Version, w ht
|
|
Filters: r.Form.Get("filters"),
|
|
Filters: r.Form.Get("filters"),
|
|
// FIXME this parameter could just be a match filter
|
|
// FIXME this parameter could just be a match filter
|
|
Filter: r.Form.Get("filter"),
|
|
Filter: r.Form.Get("filter"),
|
|
- All: toBool(r.Form.Get("all")),
|
|
|
|
|
|
+ All: boolValue(r, "all"),
|
|
}
|
|
}
|
|
|
|
|
|
images, err := s.daemon.Repositories().Images(&imagesConfig)
|
|
images, err := s.daemon.Repositories().Images(&imagesConfig)
|
|
@@ -597,8 +597,8 @@ func (s *Server) getContainersJSON(eng *engine.Engine, version version.Version,
|
|
}
|
|
}
|
|
|
|
|
|
config := &daemon.ContainersConfig{
|
|
config := &daemon.ContainersConfig{
|
|
- All: toBool(r.Form.Get("all")),
|
|
|
|
- Size: toBool(r.Form.Get("size")),
|
|
|
|
|
|
+ All: boolValue(r, "all"),
|
|
|
|
+ Size: boolValue(r, "size"),
|
|
Since: r.Form.Get("since"),
|
|
Since: r.Form.Get("since"),
|
|
Before: r.Form.Get("before"),
|
|
Before: r.Form.Get("before"),
|
|
Filters: r.Form.Get("filters"),
|
|
Filters: r.Form.Get("filters"),
|
|
@@ -640,14 +640,14 @@ func (s *Server) getContainersLogs(eng *engine.Engine, version version.Version,
|
|
}
|
|
}
|
|
|
|
|
|
// Validate args here, because we can't return not StatusOK after job.Run() call
|
|
// Validate args here, because we can't return not StatusOK after job.Run() call
|
|
- stdout, stderr := toBool(r.Form.Get("stdout")), toBool(r.Form.Get("stderr"))
|
|
|
|
|
|
+ stdout, stderr := boolValue(r, "stdout"), boolValue(r, "stderr")
|
|
if !(stdout || stderr) {
|
|
if !(stdout || stderr) {
|
|
return fmt.Errorf("Bad parameters: you must choose at least one stream")
|
|
return fmt.Errorf("Bad parameters: you must choose at least one stream")
|
|
}
|
|
}
|
|
|
|
|
|
logsConfig := &daemon.ContainerLogsConfig{
|
|
logsConfig := &daemon.ContainerLogsConfig{
|
|
- Follow: toBool(r.Form.Get("follow")),
|
|
|
|
- Timestamps: toBool(r.Form.Get("timestamps")),
|
|
|
|
|
|
+ Follow: boolValue(r, "follow"),
|
|
|
|
+ Timestamps: boolValue(r, "timestamps"),
|
|
Tail: r.Form.Get("tail"),
|
|
Tail: r.Form.Get("tail"),
|
|
UseStdout: stdout,
|
|
UseStdout: stdout,
|
|
UseStderr: stderr,
|
|
UseStderr: stderr,
|
|
@@ -671,7 +671,7 @@ func (s *Server) postImagesTag(eng *engine.Engine, version version.Version, w ht
|
|
|
|
|
|
repo := r.Form.Get("repo")
|
|
repo := r.Form.Get("repo")
|
|
tag := r.Form.Get("tag")
|
|
tag := r.Form.Get("tag")
|
|
- force := toBool(r.Form.Get("force"))
|
|
|
|
|
|
+ force := boolValue(r, "force")
|
|
if err := s.daemon.Repositories().Tag(repo, tag, vars["name"], force); err != nil {
|
|
if err := s.daemon.Repositories().Tag(repo, tag, vars["name"], force); err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
@@ -690,11 +690,20 @@ func (s *Server) postCommit(eng *engine.Engine, version version.Version, w http.
|
|
|
|
|
|
cont := r.Form.Get("container")
|
|
cont := r.Form.Get("container")
|
|
|
|
|
|
- pause := toBool(r.Form.Get("pause"))
|
|
|
|
|
|
+ pause := boolValue(r, "pause")
|
|
if r.FormValue("pause") == "" && version.GreaterThanOrEqualTo("1.13") {
|
|
if r.FormValue("pause") == "" && version.GreaterThanOrEqualTo("1.13") {
|
|
pause = true
|
|
pause = true
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ c, _, err := runconfig.DecodeContainerConfig(r.Body)
|
|
|
|
+ if err != nil && err != io.EOF { //Do not fail if body is empty.
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if c == nil {
|
|
|
|
+ c = &runconfig.Config{}
|
|
|
|
+ }
|
|
|
|
+
|
|
containerCommitConfig := &daemon.ContainerCommitConfig{
|
|
containerCommitConfig := &daemon.ContainerCommitConfig{
|
|
Pause: pause,
|
|
Pause: pause,
|
|
Repo: r.Form.Get("repo"),
|
|
Repo: r.Form.Get("repo"),
|
|
@@ -702,10 +711,10 @@ func (s *Server) postCommit(eng *engine.Engine, version version.Version, w http.
|
|
Author: r.Form.Get("author"),
|
|
Author: r.Form.Get("author"),
|
|
Comment: r.Form.Get("comment"),
|
|
Comment: r.Form.Get("comment"),
|
|
Changes: r.Form["changes"],
|
|
Changes: r.Form["changes"],
|
|
- Config: r.Body,
|
|
|
|
|
|
+ Config: c,
|
|
}
|
|
}
|
|
|
|
|
|
- imgID, err := s.daemon.ContainerCommit(cont, containerCommitConfig)
|
|
|
|
|
|
+ imgID, err := builder.Commit(s.daemon, eng, cont, containerCommitConfig)
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
@@ -782,10 +791,15 @@ func (s *Server) postImagesCreate(eng *engine.Engine, version version.Version, w
|
|
imageImportConfig.Json = false
|
|
imageImportConfig.Json = false
|
|
}
|
|
}
|
|
|
|
|
|
- if err := s.daemon.Repositories().Import(src, repo, tag, imageImportConfig, eng); err != nil {
|
|
|
|
|
|
+ newConfig, err := builder.BuildFromConfig(s.daemon, eng, &runconfig.Config{}, imageImportConfig.Changes)
|
|
|
|
+ if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
+ imageImportConfig.ContainerConfig = newConfig
|
|
|
|
|
|
|
|
+ if err := s.daemon.Repositories().Import(src, repo, tag, imageImportConfig); err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
return nil
|
|
return nil
|
|
@@ -977,9 +991,9 @@ func (s *Server) deleteContainers(eng *engine.Engine, version version.Version, w
|
|
|
|
|
|
name := vars["name"]
|
|
name := vars["name"]
|
|
config := &daemon.ContainerRmConfig{
|
|
config := &daemon.ContainerRmConfig{
|
|
- ForceRemove: toBool(r.Form.Get("force")),
|
|
|
|
- RemoveVolume: toBool(r.Form.Get("v")),
|
|
|
|
- RemoveLink: toBool(r.Form.Get("link")),
|
|
|
|
|
|
+ ForceRemove: boolValue(r, "force"),
|
|
|
|
+ RemoveVolume: boolValue(r, "v"),
|
|
|
|
+ RemoveLink: boolValue(r, "link"),
|
|
}
|
|
}
|
|
|
|
|
|
if err := s.daemon.ContainerRm(name, config); err != nil {
|
|
if err := s.daemon.ContainerRm(name, config); err != nil {
|
|
@@ -1004,8 +1018,8 @@ func (s *Server) deleteImages(eng *engine.Engine, version version.Version, w htt
|
|
}
|
|
}
|
|
|
|
|
|
name := vars["name"]
|
|
name := vars["name"]
|
|
- force := toBool(r.Form.Get("force"))
|
|
|
|
- noprune := toBool(r.Form.Get("noprune"))
|
|
|
|
|
|
+ force := boolValue(r, "force")
|
|
|
|
+ noprune := boolValue(r, "noprune")
|
|
|
|
|
|
list, err := s.daemon.ImageDelete(name, force, noprune)
|
|
list, err := s.daemon.ImageDelete(name, force, noprune)
|
|
if err != nil {
|
|
if err != nil {
|
|
@@ -1152,19 +1166,19 @@ func (s *Server) postContainersAttach(eng *engine.Engine, version version.Versio
|
|
} else {
|
|
} else {
|
|
errStream = outStream
|
|
errStream = outStream
|
|
}
|
|
}
|
|
- logs := toBool(r.Form.Get("logs"))
|
|
|
|
- stream := toBool(r.Form.Get("stream"))
|
|
|
|
|
|
+ logs := boolValue(r, "logs")
|
|
|
|
+ stream := boolValue(r, "stream")
|
|
|
|
|
|
var stdin io.ReadCloser
|
|
var stdin io.ReadCloser
|
|
var stdout, stderr io.Writer
|
|
var stdout, stderr io.Writer
|
|
|
|
|
|
- if toBool(r.Form.Get("stdin")) {
|
|
|
|
|
|
+ if boolValue(r, "stdin") {
|
|
stdin = inStream
|
|
stdin = inStream
|
|
}
|
|
}
|
|
- if toBool(r.Form.Get("stdout")) {
|
|
|
|
|
|
+ if boolValue(r, "stdout") {
|
|
stdout = outStream
|
|
stdout = outStream
|
|
}
|
|
}
|
|
- if toBool(r.Form.Get("stderr")) {
|
|
|
|
|
|
+ if boolValue(r, "stderr") {
|
|
stderr = errStream
|
|
stderr = errStream
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1246,11 +1260,9 @@ func (s *Server) postBuild(eng *engine.Engine, version version.Version, w http.R
|
|
authConfig = ®istry.AuthConfig{}
|
|
authConfig = ®istry.AuthConfig{}
|
|
configFileEncoded = r.Header.Get("X-Registry-Config")
|
|
configFileEncoded = r.Header.Get("X-Registry-Config")
|
|
configFile = ®istry.ConfigFile{}
|
|
configFile = ®istry.ConfigFile{}
|
|
- job = builder.NewBuildConfig(eng.Logging, eng.Stderr)
|
|
|
|
|
|
+ buildConfig = builder.NewBuildConfig()
|
|
)
|
|
)
|
|
|
|
|
|
- b := &builder.BuilderJob{eng, getDaemon(eng)}
|
|
|
|
-
|
|
|
|
// This block can be removed when API versions prior to 1.9 are deprecated.
|
|
// This block can be removed when API versions prior to 1.9 are deprecated.
|
|
// Both headers will be parsed and sent along to the daemon, but if a non-empty
|
|
// Both headers will be parsed and sent along to the daemon, but if a non-empty
|
|
// ConfigFile is present, any value provided as an AuthConfig directly will
|
|
// ConfigFile is present, any value provided as an AuthConfig directly will
|
|
@@ -1273,39 +1285,41 @@ func (s *Server) postBuild(eng *engine.Engine, version version.Version, w http.R
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ stdout := engine.NewOutput()
|
|
|
|
+ stdout.Set(utils.NewWriteFlusher(w))
|
|
|
|
+
|
|
if version.GreaterThanOrEqualTo("1.8") {
|
|
if version.GreaterThanOrEqualTo("1.8") {
|
|
- job.JSONFormat = true
|
|
|
|
- streamJSON(job.Stdout, w, true)
|
|
|
|
- } else {
|
|
|
|
- job.Stdout.Add(utils.NewWriteFlusher(w))
|
|
|
|
|
|
+ w.Header().Set("Content-Type", "application/json")
|
|
|
|
+ buildConfig.JSONFormat = true
|
|
}
|
|
}
|
|
|
|
|
|
- if toBool(r.FormValue("forcerm")) && version.GreaterThanOrEqualTo("1.12") {
|
|
|
|
- job.Remove = true
|
|
|
|
|
|
+ if boolValue(r, "forcerm") && version.GreaterThanOrEqualTo("1.12") {
|
|
|
|
+ buildConfig.Remove = true
|
|
} else if r.FormValue("rm") == "" && version.GreaterThanOrEqualTo("1.12") {
|
|
} else if r.FormValue("rm") == "" && version.GreaterThanOrEqualTo("1.12") {
|
|
- job.Remove = true
|
|
|
|
|
|
+ buildConfig.Remove = true
|
|
} else {
|
|
} else {
|
|
- job.Remove = toBool(r.FormValue("rm"))
|
|
|
|
|
|
+ buildConfig.Remove = boolValue(r, "rm")
|
|
}
|
|
}
|
|
- if toBool(r.FormValue("pull")) && version.GreaterThanOrEqualTo("1.16") {
|
|
|
|
- job.Pull = true
|
|
|
|
|
|
+ if boolValue(r, "pull") && version.GreaterThanOrEqualTo("1.16") {
|
|
|
|
+ buildConfig.Pull = true
|
|
}
|
|
}
|
|
- job.Stdin.Add(r.Body)
|
|
|
|
|
|
|
|
- // FIXME(calavera): !!!!! Remote might not be used. Solve the mistery before merging
|
|
|
|
- //job.Setenv("remote", r.FormValue("remote"))
|
|
|
|
- job.DockerfileName = r.FormValue("dockerfile")
|
|
|
|
- job.RepoName = r.FormValue("t")
|
|
|
|
- job.SuppressOutput = toBool(r.FormValue("q"))
|
|
|
|
- job.NoCache = toBool(r.FormValue("nocache"))
|
|
|
|
- job.ForceRemove = toBool(r.FormValue("forcerm"))
|
|
|
|
- job.AuthConfig = authConfig
|
|
|
|
- job.ConfigFile = configFile
|
|
|
|
- job.MemorySwap = toInt64(r.FormValue("memswap"))
|
|
|
|
- job.Memory = toInt64(r.FormValue("memory"))
|
|
|
|
- job.CpuShares = toInt64(r.FormValue("cpushares"))
|
|
|
|
- job.CpuSetCpus = r.FormValue("cpusetcpus")
|
|
|
|
- job.CpuSetMems = r.FormValue("cpusetmems")
|
|
|
|
|
|
+ buildConfig.Stdout = stdout
|
|
|
|
+ buildConfig.Context = r.Body
|
|
|
|
+
|
|
|
|
+ buildConfig.RemoteURL = r.FormValue("remote")
|
|
|
|
+ buildConfig.DockerfileName = r.FormValue("dockerfile")
|
|
|
|
+ buildConfig.RepoName = r.FormValue("t")
|
|
|
|
+ buildConfig.SuppressOutput = boolValue(r, "q")
|
|
|
|
+ buildConfig.NoCache = boolValue(r, "nocache")
|
|
|
|
+ buildConfig.ForceRemove = boolValue(r, "forcerm")
|
|
|
|
+ buildConfig.AuthConfig = authConfig
|
|
|
|
+ buildConfig.ConfigFile = configFile
|
|
|
|
+ buildConfig.MemorySwap = int64Value(r, "memswap")
|
|
|
|
+ buildConfig.Memory = int64Value(r, "memory")
|
|
|
|
+ buildConfig.CpuShares = int64Value(r, "cpushares")
|
|
|
|
+ buildConfig.CpuSetCpus = r.FormValue("cpusetcpus")
|
|
|
|
+ buildConfig.CpuSetMems = r.FormValue("cpusetmems")
|
|
|
|
|
|
// Job cancellation. Note: not all job types support this.
|
|
// Job cancellation. Note: not all job types support this.
|
|
if closeNotifier, ok := w.(http.CloseNotifier); ok {
|
|
if closeNotifier, ok := w.(http.CloseNotifier); ok {
|
|
@@ -1316,13 +1330,13 @@ func (s *Server) postBuild(eng *engine.Engine, version version.Version, w http.R
|
|
case <-finished:
|
|
case <-finished:
|
|
case <-closeNotifier.CloseNotify():
|
|
case <-closeNotifier.CloseNotify():
|
|
logrus.Infof("Client disconnected, cancelling job: build")
|
|
logrus.Infof("Client disconnected, cancelling job: build")
|
|
- job.Cancel()
|
|
|
|
|
|
+ buildConfig.Cancel()
|
|
}
|
|
}
|
|
}()
|
|
}()
|
|
}
|
|
}
|
|
|
|
|
|
- if err := b.CmdBuild(job); err != nil {
|
|
|
|
- if !job.Stdout.Used() {
|
|
|
|
|
|
+ if err := builder.Build(s.daemon, eng, buildConfig); err != nil {
|
|
|
|
+ if !stdout.Used() {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
sf := streamformatter.NewStreamFormatter(version.GreaterThanOrEqualTo("1.8"))
|
|
sf := streamformatter.NewStreamFormatter(version.GreaterThanOrEqualTo("1.8"))
|
|
@@ -1676,17 +1690,3 @@ func allocateDaemonPort(addr string) error {
|
|
}
|
|
}
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
-
|
|
|
|
-func toBool(s string) bool {
|
|
|
|
- s = strings.ToLower(strings.TrimSpace(s))
|
|
|
|
- return !(s == "" || s == "0" || s == "no" || s == "false" || s == "none")
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-// FIXME(calavera): This is a copy of the Env.GetInt64
|
|
|
|
-func toInt64(s string) int64 {
|
|
|
|
- val, err := strconv.ParseInt(s, 10, 64)
|
|
|
|
- if err != nil {
|
|
|
|
- return 0
|
|
|
|
- }
|
|
|
|
- return val
|
|
|
|
-}
|
|
|