This reverts commit b9731bccf2b2cc8c06ef8bdb41f72ca4791e63db.
Conflicts:
server/server.go
Docker-DCO-1.1-Signed-off-by: Victor Vieux <vieux@docker.com> (github: vieux)
| ... | ... |
@@ -872,6 +872,8 @@ func postBuild(eng *engine.Engine, version version.Version, w http.ResponseWrite |
| 872 | 872 |
return fmt.Errorf("Multipart upload for build is no longer supported. Please upgrade your docker client.")
|
| 873 | 873 |
} |
| 874 | 874 |
var ( |
| 875 |
+ authEncoded = r.Header.Get("X-Registry-Auth")
|
|
| 876 |
+ authConfig = ®istry.AuthConfig{}
|
|
| 875 | 877 |
configFileEncoded = r.Header.Get("X-Registry-Config")
|
| 876 | 878 |
configFile = ®istry.ConfigFile{}
|
| 877 | 879 |
job = eng.Job("build")
|
| ... | ... |
@@ -881,22 +883,14 @@ func postBuild(eng *engine.Engine, version version.Version, w http.ResponseWrite |
| 881 | 881 |
// Both headers will be parsed and sent along to the daemon, but if a non-empty |
| 882 | 882 |
// ConfigFile is present, any value provided as an AuthConfig directly will |
| 883 | 883 |
// be overridden. See BuildFile::CmdFrom for details. |
| 884 |
- // /* |
|
| 885 |
- var ( |
|
| 886 |
- authEncoded = r.Header.Get("X-Registry-Auth")
|
|
| 887 |
- authConfig = ®istry.AuthConfig{}
|
|
| 888 |
- ) |
|
| 889 | 884 |
if version.LessThan("1.9") && authEncoded != "" {
|
| 890 | 885 |
authJson := base64.NewDecoder(base64.URLEncoding, strings.NewReader(authEncoded)) |
| 891 | 886 |
if err := json.NewDecoder(authJson).Decode(authConfig); err != nil {
|
| 892 | 887 |
// for a pull it is not an error if no auth was given |
| 893 | 888 |
// to increase compatibility with the existing api it is defaulting to be empty |
| 894 | 889 |
authConfig = ®istry.AuthConfig{}
|
| 895 |
- } else {
|
|
| 896 |
- configFile.Configs[authConfig.ServerAddress] = *authConfig |
|
| 897 | 890 |
} |
| 898 | 891 |
} |
| 899 |
- // */ |
|
| 900 | 892 |
|
| 901 | 893 |
if configFileEncoded != "" {
|
| 902 | 894 |
configFileJson := base64.NewDecoder(base64.URLEncoding, strings.NewReader(configFileEncoded)) |
| ... | ... |
@@ -919,6 +913,7 @@ func postBuild(eng *engine.Engine, version version.Version, w http.ResponseWrite |
| 919 | 919 |
job.Setenv("q", r.FormValue("q"))
|
| 920 | 920 |
job.Setenv("nocache", r.FormValue("nocache"))
|
| 921 | 921 |
job.Setenv("rm", r.FormValue("rm"))
|
| 922 |
+ job.SetenvJson("authConfig", authConfig)
|
|
| 922 | 923 |
job.SetenvJson("configFile", configFile)
|
| 923 | 924 |
|
| 924 | 925 |
if err := job.Run(); err != nil {
|
| ... | ... |
@@ -394,7 +394,7 @@ func buildImage(context testContextTemplate, t *testing.T, eng *engine.Engine, u |
| 394 | 394 |
} |
| 395 | 395 |
dockerfile := constructDockerfile(context.dockerfile, ip, port) |
| 396 | 396 |
|
| 397 |
- buildfile := server.NewBuildFile(srv, ioutil.Discard, ioutil.Discard, false, useCache, false, ioutil.Discard, utils.NewStreamFormatter(false), nil) |
|
| 397 |
+ buildfile := server.NewBuildFile(srv, ioutil.Discard, ioutil.Discard, false, useCache, false, ioutil.Discard, utils.NewStreamFormatter(false), nil, nil) |
|
| 398 | 398 |
id, err := buildfile.Build(context.Archive(dockerfile, t)) |
| 399 | 399 |
if err != nil {
|
| 400 | 400 |
return nil, err |
| ... | ... |
@@ -828,7 +828,7 @@ func TestForbiddenContextPath(t *testing.T) {
|
| 828 | 828 |
} |
| 829 | 829 |
dockerfile := constructDockerfile(context.dockerfile, ip, port) |
| 830 | 830 |
|
| 831 |
- buildfile := server.NewBuildFile(srv, ioutil.Discard, ioutil.Discard, false, true, false, ioutil.Discard, utils.NewStreamFormatter(false), nil) |
|
| 831 |
+ buildfile := server.NewBuildFile(srv, ioutil.Discard, ioutil.Discard, false, true, false, ioutil.Discard, utils.NewStreamFormatter(false), nil, nil) |
|
| 832 | 832 |
_, err = buildfile.Build(context.Archive(dockerfile, t)) |
| 833 | 833 |
|
| 834 | 834 |
if err == nil {
|
| ... | ... |
@@ -874,7 +874,7 @@ func TestBuildADDFileNotFound(t *testing.T) {
|
| 874 | 874 |
} |
| 875 | 875 |
dockerfile := constructDockerfile(context.dockerfile, ip, port) |
| 876 | 876 |
|
| 877 |
- buildfile := server.NewBuildFile(mkServerFromEngine(eng, t), ioutil.Discard, ioutil.Discard, false, true, false, ioutil.Discard, utils.NewStreamFormatter(false), nil) |
|
| 877 |
+ buildfile := server.NewBuildFile(mkServerFromEngine(eng, t), ioutil.Discard, ioutil.Discard, false, true, false, ioutil.Discard, utils.NewStreamFormatter(false), nil, nil) |
|
| 878 | 878 |
_, err = buildfile.Build(context.Archive(dockerfile, t)) |
| 879 | 879 |
|
| 880 | 880 |
if err == nil {
|
| ... | ... |
@@ -50,6 +50,7 @@ type buildFile struct {
|
| 50 | 50 |
utilizeCache bool |
| 51 | 51 |
rm bool |
| 52 | 52 |
|
| 53 |
+ authConfig *registry.AuthConfig |
|
| 53 | 54 |
configFile *registry.ConfigFile |
| 54 | 55 |
|
| 55 | 56 |
tmpContainers map[string]struct{}
|
| ... | ... |
@@ -80,10 +81,20 @@ func (b *buildFile) CmdFrom(name string) error {
|
| 80 | 80 |
if err != nil {
|
| 81 | 81 |
if b.daemon.Graph().IsNotExist(err) {
|
| 82 | 82 |
remote, tag := utils.ParseRepositoryTag(name) |
| 83 |
+ pullRegistryAuth := b.authConfig |
|
| 84 |
+ if len(b.configFile.Configs) > 0 {
|
|
| 85 |
+ // The request came with a full auth config file, we prefer to use that |
|
| 86 |
+ endpoint, _, err := registry.ResolveRepositoryName(remote) |
|
| 87 |
+ if err != nil {
|
|
| 88 |
+ return err |
|
| 89 |
+ } |
|
| 90 |
+ resolvedAuth := b.configFile.ResolveAuthConfig(endpoint) |
|
| 91 |
+ pullRegistryAuth = &resolvedAuth |
|
| 92 |
+ } |
|
| 83 | 93 |
job := b.srv.Eng.Job("pull", remote, tag)
|
| 84 | 94 |
job.SetenvBool("json", b.sf.Json())
|
| 85 | 95 |
job.SetenvBool("parallel", true)
|
| 86 |
- job.SetenvJson("configFile", b.configFile)
|
|
| 96 |
+ job.SetenvJson("authConfig", pullRegistryAuth)
|
|
| 87 | 97 |
job.Stdout.Add(b.outOld) |
| 88 | 98 |
if err := job.Run(); err != nil {
|
| 89 | 99 |
return err |
| ... | ... |
@@ -821,7 +832,7 @@ func stripComments(raw []byte) string {
|
| 821 | 821 |
return strings.Join(out, "\n") |
| 822 | 822 |
} |
| 823 | 823 |
|
| 824 |
-func NewBuildFile(srv *Server, outStream, errStream io.Writer, verbose, utilizeCache, rm bool, outOld io.Writer, sf *utils.StreamFormatter, configFile *registry.ConfigFile) BuildFile {
|
|
| 824 |
+func NewBuildFile(srv *Server, outStream, errStream io.Writer, verbose, utilizeCache, rm bool, outOld io.Writer, sf *utils.StreamFormatter, auth *registry.AuthConfig, authConfigFile *registry.ConfigFile) BuildFile {
|
|
| 825 | 825 |
return &buildFile{
|
| 826 | 826 |
daemon: srv.daemon, |
| 827 | 827 |
srv: srv, |
| ... | ... |
@@ -834,7 +845,8 @@ func NewBuildFile(srv *Server, outStream, errStream io.Writer, verbose, utilizeC |
| 834 | 834 |
utilizeCache: utilizeCache, |
| 835 | 835 |
rm: rm, |
| 836 | 836 |
sf: sf, |
| 837 |
- configFile: configFile, |
|
| 837 |
+ authConfig: auth, |
|
| 838 |
+ configFile: authConfigFile, |
|
| 838 | 839 |
outOld: outOld, |
| 839 | 840 |
} |
| 840 | 841 |
} |
| ... | ... |
@@ -428,10 +428,12 @@ func (srv *Server) Build(job *engine.Job) engine.Status {
|
| 428 | 428 |
suppressOutput = job.GetenvBool("q")
|
| 429 | 429 |
noCache = job.GetenvBool("nocache")
|
| 430 | 430 |
rm = job.GetenvBool("rm")
|
| 431 |
+ authConfig = ®istry.AuthConfig{}
|
|
| 431 | 432 |
configFile = ®istry.ConfigFile{}
|
| 432 | 433 |
tag string |
| 433 | 434 |
context io.ReadCloser |
| 434 | 435 |
) |
| 436 |
+ job.GetenvJson("authConfig", authConfig)
|
|
| 435 | 437 |
job.GetenvJson("configFile", configFile)
|
| 436 | 438 |
repoName, tag = utils.ParseRepositoryTag(repoName) |
| 437 | 439 |
|
| ... | ... |
@@ -484,7 +486,7 @@ func (srv *Server) Build(job *engine.Job) engine.Status {
|
| 484 | 484 |
Writer: job.Stdout, |
| 485 | 485 |
StreamFormatter: sf, |
| 486 | 486 |
}, |
| 487 |
- !suppressOutput, !noCache, rm, job.Stdout, sf, configFile) |
|
| 487 |
+ !suppressOutput, !noCache, rm, job.Stdout, sf, authConfig, configFile) |
|
| 488 | 488 |
id, err := b.Build(context) |
| 489 | 489 |
if err != nil {
|
| 490 | 490 |
return job.Error(err) |
| ... | ... |
@@ -1341,23 +1343,16 @@ func (srv *Server) ImagePull(job *engine.Job) engine.Status {
|
| 1341 | 1341 |
localName = job.Args[0] |
| 1342 | 1342 |
tag string |
| 1343 | 1343 |
sf = utils.NewStreamFormatter(job.GetenvBool("json"))
|
| 1344 |
- authConfig registry.AuthConfig |
|
| 1345 |
- configFile = ®istry.ConfigFile{}
|
|
| 1344 |
+ authConfig = ®istry.AuthConfig{}
|
|
| 1346 | 1345 |
metaHeaders map[string][]string |
| 1347 | 1346 |
) |
| 1348 | 1347 |
if len(job.Args) > 1 {
|
| 1349 | 1348 |
tag = job.Args[1] |
| 1350 | 1349 |
} |
| 1351 | 1350 |
|
| 1352 |
- job.GetenvJson("configFile", configFile)
|
|
| 1351 |
+ job.GetenvJson("authConfig", authConfig)
|
|
| 1353 | 1352 |
job.GetenvJson("metaHeaders", metaHeaders)
|
| 1354 | 1353 |
|
| 1355 |
- endpoint, _, err := registry.ResolveRepositoryName(localName) |
|
| 1356 |
- if err != nil {
|
|
| 1357 |
- return job.Error(err) |
|
| 1358 |
- } |
|
| 1359 |
- authConfig = configFile.ResolveAuthConfig(endpoint) |
|
| 1360 |
- |
|
| 1361 | 1354 |
c, err := srv.poolAdd("pull", localName+":"+tag)
|
| 1362 | 1355 |
if err != nil {
|
| 1363 | 1356 |
if c != nil {
|
| ... | ... |
@@ -1376,12 +1371,12 @@ func (srv *Server) ImagePull(job *engine.Job) engine.Status {
|
| 1376 | 1376 |
return job.Error(err) |
| 1377 | 1377 |
} |
| 1378 | 1378 |
|
| 1379 |
- endpoint, err = registry.ExpandAndVerifyRegistryUrl(hostname) |
|
| 1379 |
+ endpoint, err := registry.ExpandAndVerifyRegistryUrl(hostname) |
|
| 1380 | 1380 |
if err != nil {
|
| 1381 | 1381 |
return job.Error(err) |
| 1382 | 1382 |
} |
| 1383 | 1383 |
|
| 1384 |
- r, err := registry.NewRegistry(&authConfig, registry.HTTPRequestFactory(metaHeaders), endpoint) |
|
| 1384 |
+ r, err := registry.NewRegistry(authConfig, registry.HTTPRequestFactory(metaHeaders), endpoint) |
|
| 1385 | 1385 |
if err != nil {
|
| 1386 | 1386 |
return job.Error(err) |
| 1387 | 1387 |
} |