@@ -154,13 +154,13 @@ func run(ctx context.Context, opts options.Options, execArgs *execArgsInfo) erro
154154
155155 opts .Logger (log .LevelInfo , "%s %s - Build development environments from repositories in a container" , newColor (color .Bold ).Sprintf ("envbuilder" ), buildinfo .Version ())
156156
157- cleanupDockerConfigJSON , err := initDockerConfigJSON (opts .Logger , workingDir , opts .DockerConfigBase64 )
157+ cleanupDockerConfigOverride , err := initDockerConfigOverride (opts .Logger , workingDir , opts .DockerConfigBase64 )
158158 if err != nil {
159159 return err
160160 }
161161 defer func () {
162- if err := cleanupDockerConfigJSON (); err != nil {
163- opts .Logger (log .LevelError , "failed to cleanup docker config JSON : %w" , err )
162+ if err := cleanupDockerConfigOverride (); err != nil {
163+ opts .Logger (log .LevelError , "failed to cleanup docker config override : %w" , err )
164164 }
165165 }() // best effort
166166
@@ -771,7 +771,7 @@ func run(ctx context.Context, opts options.Options, execArgs *execArgsInfo) erro
771771 }
772772
773773 // Remove the Docker config secret file!
774- if err := cleanupDockerConfigJSON (); err != nil {
774+ if err := cleanupDockerConfigOverride (); err != nil {
775775 return err
776776 }
777777
@@ -978,13 +978,13 @@ func RunCacheProbe(ctx context.Context, opts options.Options) (v1.Image, error)
978978
979979 opts .Logger (log .LevelInfo , "%s %s - Build development environments from repositories in a container" , newColor (color .Bold ).Sprintf ("envbuilder" ), buildinfo .Version ())
980980
981- cleanupDockerConfigJSON , err := initDockerConfigJSON (opts .Logger , workingDir , opts .DockerConfigBase64 )
981+ cleanupDockerConfigOverride , err := initDockerConfigOverride (opts .Logger , workingDir , opts .DockerConfigBase64 )
982982 if err != nil {
983983 return nil , err
984984 }
985985 defer func () {
986- if err := cleanupDockerConfigJSON (); err != nil {
987- opts .Logger (log .LevelError , "failed to cleanup docker config JSON : %w" , err )
986+ if err := cleanupDockerConfigOverride (); err != nil {
987+ opts .Logger (log .LevelError , "failed to cleanup docker config override : %w" , err )
988988 }
989989 }() // best effort
990990
@@ -1315,7 +1315,7 @@ func RunCacheProbe(ctx context.Context, opts options.Options) (v1.Image, error)
13151315 options .UnsetEnv ()
13161316
13171317 // Remove the Docker config secret file!
1318- if err := cleanupDockerConfigJSON (); err != nil {
1318+ if err := cleanupDockerConfigOverride (); err != nil {
13191319 return nil , err
13201320 }
13211321
@@ -1627,55 +1627,85 @@ func parseMagicImageFile(fs billy.Filesystem, path string, v any) error {
16271627 return nil
16281628}
16291629
1630- func initDockerConfigJSON (logf log.Func , workingDir workingdir.WorkingDir , dockerConfigBase64 string ) (func () error , error ) {
1630+ func initDockerConfigOverride (logf log.Func , workingDir workingdir.WorkingDir , dockerConfigBase64 string ) (func () error , error ) {
16311631 var cleanupOnce sync.Once
1632- noop := func () error { return nil }
1632+
1633+ var (
1634+ oldDockerConfig = os .Getenv ("DOCKER_CONFIG" )
1635+ newDockerConfig = workingDir .Path ()
1636+ cfgPath = workingDir .Join ("config.json" )
1637+ )
1638+
1639+ restoreEnv := func () error { return nil } // noop.
1640+ if dockerConfigBase64 != "" || (dockerConfigBase64 == "" && oldDockerConfig == "" ) {
1641+ err := os .Setenv ("DOCKER_CONFIG" , newDockerConfig )
1642+ if err != nil {
1643+ logf (log .LevelError , "Failed to set DOCKER_CONFIG: %s" , err )
1644+ return nil , fmt .Errorf ("set DOCKER_CONFIG: %w" , err )
1645+ }
1646+ logf (log .LevelInfo , "Set DOCKER_CONFIG to %s" , newDockerConfig )
1647+
1648+ restoreEnv = func () error {
1649+ // Restore the old DOCKER_CONFIG value.
1650+ if oldDockerConfig == "" {
1651+ err := os .Unsetenv ("DOCKER_CONFIG" )
1652+ if err != nil {
1653+ err = fmt .Errorf ("unset DOCKER_CONFIG: %w" , err )
1654+ }
1655+ return err
1656+ }
1657+ err := os .Setenv ("DOCKER_CONFIG" , oldDockerConfig )
1658+ if err != nil {
1659+ return fmt .Errorf ("restore DOCKER_CONFIG: %w" , err )
1660+ }
1661+ logf (log .LevelInfo , "Restored DOCKER_CONFIG to %s" , oldDockerConfig )
1662+ return nil
1663+ }
1664+ } else {
1665+ logf (log .LevelInfo , "Using existing DOCKER_CONFIG set to %s" , oldDockerConfig )
1666+ }
1667+
16331668 if dockerConfigBase64 == "" {
1634- return noop , nil
1669+ return restoreEnv , nil
16351670 }
1636- cfgPath := workingDir . Join ( "config.json" )
1671+
16371672 decoded , err := base64 .StdEncoding .DecodeString (dockerConfigBase64 )
16381673 if err != nil {
1639- return noop , fmt .Errorf ("decode docker config: %w" , err )
1674+ return restoreEnv , fmt .Errorf ("decode docker config: %w" , err )
16401675 }
16411676 var configFile DockerConfig
16421677 decoded , err = hujson .Standardize (decoded )
16431678 if err != nil {
1644- return noop , fmt .Errorf ("humanize json for docker config: %w" , err )
1679+ return restoreEnv , fmt .Errorf ("humanize json for docker config: %w" , err )
16451680 }
16461681 err = json .Unmarshal (decoded , & configFile )
16471682 if err != nil {
1648- return noop , fmt .Errorf ("parse docker config: %w" , err )
1683+ return restoreEnv , fmt .Errorf ("parse docker config: %w" , err )
16491684 }
16501685 for k := range configFile .AuthConfigs {
16511686 logf (log .LevelInfo , "Docker config contains auth for registry %q" , k )
16521687 }
16531688 err = os .WriteFile (cfgPath , decoded , 0o644 )
16541689 if err != nil {
1655- return noop , fmt .Errorf ("write docker config: %w" , err )
1690+ return restoreEnv , fmt .Errorf ("write docker config: %w" , err )
16561691 }
16571692 logf (log .LevelInfo , "Wrote Docker config JSON to %s" , cfgPath )
1658- oldDockerConfig := os .Getenv ("DOCKER_CONFIG" )
1659- _ = os .Setenv ("DOCKER_CONFIG" , workingDir .Path ())
1660- newDockerConfig := os .Getenv ("DOCKER_CONFIG" )
1661- logf (log .LevelInfo , "Set DOCKER_CONFIG to %s" , newDockerConfig )
1662- cleanup := func () error {
1693+
1694+ return func () error {
16631695 var cleanupErr error
16641696 cleanupOnce .Do (func () {
1665- // Restore the old DOCKER_CONFIG value.
1666- os .Setenv ("DOCKER_CONFIG" , oldDockerConfig )
1667- logf (log .LevelInfo , "Restored DOCKER_CONFIG to %s" , oldDockerConfig )
1697+ cleanupErr = restoreEnv ()
16681698 // Remove the Docker config secret file!
1669- if cleanupErr = os .Remove (cfgPath ); err != nil {
1699+ if err : = os .Remove (cfgPath ); err != nil {
16701700 if ! errors .Is (err , fs .ErrNotExist ) {
1671- cleanupErr = fmt .Errorf ("remove docker config: %w" , cleanupErr )
1701+ err = errors . Join ( err , fmt .Errorf ("remove docker config: %w" , err ) )
16721702 }
16731703 logf (log .LevelError , "Failed to remove the Docker config secret file: %s" , cleanupErr )
1704+ cleanupErr = errors .Join (cleanupErr , err )
16741705 }
16751706 })
16761707 return cleanupErr
1677- }
1678- return cleanup , err
1708+ }, nil
16791709}
16801710
16811711// Allows quick testing of layer caching using a local directory!
0 commit comments