@@ -18,23 +18,23 @@ import (
1818 "strconv"
1919 "strings"
2020
21+ "github.com/docker/distribution/reference"
2122 "github.com/docker/docker/api"
2223 Cli "github.com/docker/docker/cli"
23- "github.com/docker/docker/graph/tags"
2424 "github.com/docker/docker/opts"
2525 "github.com/docker/docker/pkg/archive"
2626 "github.com/docker/docker/pkg/fileutils"
2727 "github.com/docker/docker/pkg/httputils"
2828 "github.com/docker/docker/pkg/jsonmessage"
2929 flag "github.com/docker/docker/pkg/mflag"
30- "github.com/docker/docker/pkg/parsers"
3130 "github.com/docker/docker/pkg/progressreader"
3231 "github.com/docker/docker/pkg/streamformatter"
3332 "github.com/docker/docker/pkg/ulimit"
3433 "github.com/docker/docker/pkg/units"
3534 "github.com/docker/docker/pkg/urlutil"
3635 "github.com/docker/docker/registry"
3736 "github.com/docker/docker/runconfig"
37+ tagpkg "github.com/docker/docker/tag"
3838 "github.com/docker/docker/utils"
3939)
4040
@@ -323,7 +323,7 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
323323 // Since the build was successful, now we must tag any of the resolved
324324 // images from the above Dockerfile rewrite.
325325 for _ , resolved := range resolvedTags {
326- if err := cli .tagTrusted (resolved .repoInfo , resolved . digestRef , resolved .tagRef ); err != nil {
326+ if err := cli .tagTrusted (resolved .digestRef , resolved .tagRef ); err != nil {
327327 return err
328328 }
329329 }
@@ -333,16 +333,12 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
333333
334334// validateTag checks if the given image name can be resolved.
335335func validateTag (rawRepo string ) (string , error ) {
336- repository , tag := parsers . ParseRepositoryTag (rawRepo )
337- if err := registry . ValidateRepositoryName ( repository ); err != nil {
336+ ref , err := reference . ParseNamed (rawRepo )
337+ if err != nil {
338338 return "" , err
339339 }
340340
341- if len (tag ) == 0 {
342- return rawRepo , nil
343- }
344-
345- if err := tags .ValidateTagName (tag ); err != nil {
341+ if err := registry .ValidateRepositoryName (ref ); err != nil {
346342 return "" , err
347343 }
348344
@@ -565,15 +561,16 @@ func (td *trustedDockerfile) Close() error {
565561// resolvedTag records the repository, tag, and resolved digest reference
566562// from a Dockerfile rewrite.
567563type resolvedTag struct {
568- repoInfo * registry.RepositoryInfo
569- digestRef , tagRef registry.Reference
564+ repoInfo * registry.RepositoryInfo
565+ digestRef reference.Canonical
566+ tagRef reference.NamedTagged
570567}
571568
572569// rewriteDockerfileFrom rewrites the given Dockerfile by resolving images in
573570// "FROM <image>" instructions to a digest reference. `translator` is a
574571// function that takes a repository name and tag reference and returns a
575572// trusted digest reference.
576- func rewriteDockerfileFrom (dockerfileName string , translator func (string , registry. Reference ) (registry. Reference , error )) (newDockerfile * trustedDockerfile , resolvedTags []* resolvedTag , err error ) {
573+ func rewriteDockerfileFrom (dockerfileName string , translator func (reference. NamedTagged ) (reference. Canonical , error )) (newDockerfile * trustedDockerfile , resolvedTags []* resolvedTag , err error ) {
577574 dockerfile , err := os .Open (dockerfileName )
578575 if err != nil {
579576 return nil , nil , fmt .Errorf ("unable to open Dockerfile: %v" , err )
@@ -607,29 +604,39 @@ func rewriteDockerfileFrom(dockerfileName string, translator func(string, regist
607604 matches := dockerfileFromLinePattern .FindStringSubmatch (line )
608605 if matches != nil && matches [1 ] != "scratch" {
609606 // Replace the line with a resolved "FROM repo@digest"
610- repo , tag := parsers . ParseRepositoryTag (matches [1 ])
611- if tag == "" {
612- tag = tags . DefaultTag
607+ ref , err := reference . ParseNamed (matches [1 ])
608+ if err != nil {
609+ return nil , nil , err
613610 }
614611
615- repoInfo , err := registry .ParseRepositoryInfo (repo )
616- if err != nil {
617- return nil , nil , fmt .Errorf ("unable to parse repository info %q: %v" , repo , err )
612+ digested := false
613+ switch ref .(type ) {
614+ case reference.Tagged :
615+ case reference.Digested :
616+ digested = true
617+ default :
618+ ref , err = reference .WithTag (ref , tagpkg .DefaultTag )
619+ if err != nil {
620+ return nil , nil , err
621+ }
618622 }
619623
620- ref := registry .ParseReference (tag )
624+ repoInfo , err := registry .ParseRepositoryInfo (ref )
625+ if err != nil {
626+ return nil , nil , fmt .Errorf ("unable to parse repository info %q: %v" , ref .String (), err )
627+ }
621628
622- if ! ref . HasDigest () && isTrusted () {
623- trustedRef , err := translator (repo , ref )
629+ if ! digested && isTrusted () {
630+ trustedRef , err := translator (ref .(reference. NamedTagged ) )
624631 if err != nil {
625632 return nil , nil , err
626633 }
627634
628- line = dockerfileFromLinePattern .ReplaceAllLiteralString (line , fmt .Sprintf ("FROM %s" , trustedRef .ImageName ( repo )))
635+ line = dockerfileFromLinePattern .ReplaceAllLiteralString (line , fmt .Sprintf ("FROM %s" , trustedRef .String ( )))
629636 resolvedTags = append (resolvedTags , & resolvedTag {
630637 repoInfo : repoInfo ,
631638 digestRef : trustedRef ,
632- tagRef : ref ,
639+ tagRef : ref .(reference. NamedTagged ) ,
633640 })
634641 }
635642 }
0 commit comments