@@ -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,84 @@ 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+ restoreEnv = func () error { return nil } // noop.
1638+ )
1639+ if dockerConfigBase64 != "" || (dockerConfigBase64 == "" && oldDockerConfig == "" ) {
1640+ err := os .Setenv ("DOCKER_CONFIG" , newDockerConfig )
1641+ if err != nil {
1642+ logf (log .LevelError , "Failed to set DOCKER_CONFIG: %s" , err )
1643+ return nil , fmt .Errorf ("set DOCKER_CONFIG: %w" , err )
1644+ }
1645+ logf (log .LevelInfo , "Set DOCKER_CONFIG to %s" , newDockerConfig )
1646+
1647+ restoreEnv = func () error {
1648+ // Restore the old DOCKER_CONFIG value.
1649+ if oldDockerConfig == "" {
1650+ err := os .Unsetenv ("DOCKER_CONFIG" )
1651+ if err != nil {
1652+ err = fmt .Errorf ("unset DOCKER_CONFIG: %w" , err )
1653+ }
1654+ return err
1655+ }
1656+ err := os .Setenv ("DOCKER_CONFIG" , oldDockerConfig )
1657+ if err != nil {
1658+ return fmt .Errorf ("restore DOCKER_CONFIG: %w" , err )
1659+ }
1660+ logf (log .LevelInfo , "Restored DOCKER_CONFIG to %s" , oldDockerConfig )
1661+ return nil
1662+ }
1663+ } else {
1664+ logf (log .LevelInfo , "Using existing DOCKER_CONFIG set to %s" , oldDockerConfig )
1665+ }
1666+
16331667 if dockerConfigBase64 == "" {
1634- return noop , nil
1668+ return restoreEnv , nil
16351669 }
1636- cfgPath := workingDir . Join ( "config.json" )
1670+
16371671 decoded , err := base64 .StdEncoding .DecodeString (dockerConfigBase64 )
16381672 if err != nil {
1639- return noop , fmt .Errorf ("decode docker config: %w" , err )
1673+ return restoreEnv , fmt .Errorf ("decode docker config: %w" , err )
16401674 }
16411675 var configFile DockerConfig
16421676 decoded , err = hujson .Standardize (decoded )
16431677 if err != nil {
1644- return noop , fmt .Errorf ("humanize json for docker config: %w" , err )
1678+ return restoreEnv , fmt .Errorf ("humanize json for docker config: %w" , err )
16451679 }
16461680 err = json .Unmarshal (decoded , & configFile )
16471681 if err != nil {
1648- return noop , fmt .Errorf ("parse docker config: %w" , err )
1682+ return restoreEnv , fmt .Errorf ("parse docker config: %w" , err )
16491683 }
16501684 for k := range configFile .AuthConfigs {
16511685 logf (log .LevelInfo , "Docker config contains auth for registry %q" , k )
16521686 }
16531687 err = os .WriteFile (cfgPath , decoded , 0o644 )
16541688 if err != nil {
1655- return noop , fmt .Errorf ("write docker config: %w" , err )
1689+ return restoreEnv , fmt .Errorf ("write docker config: %w" , err )
16561690 }
16571691 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 {
1692+
1693+ return func () error {
16631694 var cleanupErr error
16641695 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 )
1696+ cleanupErr = restoreEnv ()
16681697 // Remove the Docker config secret file!
1669- if cleanupErr = os .Remove (cfgPath ); err != nil {
1698+ if err : = os .Remove (cfgPath ); err != nil {
16701699 if ! errors .Is (err , fs .ErrNotExist ) {
1671- cleanupErr = fmt .Errorf ("remove docker config: %w" , cleanupErr )
1700+ err = errors . Join ( err , fmt .Errorf ("remove docker config: %w" , err ) )
16721701 }
16731702 logf (log .LevelError , "Failed to remove the Docker config secret file: %s" , cleanupErr )
1703+ cleanupErr = errors .Join (cleanupErr , err )
16741704 }
16751705 })
16761706 return cleanupErr
1677- }
1678- return cleanup , err
1707+ }, nil
16791708}
16801709
16811710// Allows quick testing of layer caching using a local directory!
0 commit comments