@@ -154,13 +154,13 @@ func run(ctx context.Context, opts options.Options, execArgs *execArgsInfo) erro
154
154
155
155
opts .Logger (log .LevelInfo , "%s %s - Build development environments from repositories in a container" , newColor (color .Bold ).Sprintf ("envbuilder" ), buildinfo .Version ())
156
156
157
- cleanupDockerConfigJSON , err := initDockerConfigJSON (opts .Logger , workingDir , opts .DockerConfigBase64 )
157
+ cleanupDockerConfigOverride , err := initDockerConfigOverride (opts .Logger , workingDir , opts .DockerConfigBase64 )
158
158
if err != nil {
159
159
return err
160
160
}
161
161
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 )
164
164
}
165
165
}() // best effort
166
166
@@ -771,7 +771,7 @@ func run(ctx context.Context, opts options.Options, execArgs *execArgsInfo) erro
771
771
}
772
772
773
773
// Remove the Docker config secret file!
774
- if err := cleanupDockerConfigJSON (); err != nil {
774
+ if err := cleanupDockerConfigOverride (); err != nil {
775
775
return err
776
776
}
777
777
@@ -978,13 +978,13 @@ func RunCacheProbe(ctx context.Context, opts options.Options) (v1.Image, error)
978
978
979
979
opts .Logger (log .LevelInfo , "%s %s - Build development environments from repositories in a container" , newColor (color .Bold ).Sprintf ("envbuilder" ), buildinfo .Version ())
980
980
981
- cleanupDockerConfigJSON , err := initDockerConfigJSON (opts .Logger , workingDir , opts .DockerConfigBase64 )
981
+ cleanupDockerConfigOverride , err := initDockerConfigOverride (opts .Logger , workingDir , opts .DockerConfigBase64 )
982
982
if err != nil {
983
983
return nil , err
984
984
}
985
985
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 )
988
988
}
989
989
}() // best effort
990
990
@@ -1315,7 +1315,7 @@ func RunCacheProbe(ctx context.Context, opts options.Options) (v1.Image, error)
1315
1315
options .UnsetEnv ()
1316
1316
1317
1317
// Remove the Docker config secret file!
1318
- if err := cleanupDockerConfigJSON (); err != nil {
1318
+ if err := cleanupDockerConfigOverride (); err != nil {
1319
1319
return nil , err
1320
1320
}
1321
1321
@@ -1627,55 +1627,84 @@ func parseMagicImageFile(fs billy.Filesystem, path string, v any) error {
1627
1627
return nil
1628
1628
}
1629
1629
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 ) {
1631
1631
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
+
1633
1667
if dockerConfigBase64 == "" {
1634
- return noop , nil
1668
+ return restoreEnv , nil
1635
1669
}
1636
- cfgPath := workingDir . Join ( "config.json" )
1670
+
1637
1671
decoded , err := base64 .StdEncoding .DecodeString (dockerConfigBase64 )
1638
1672
if err != nil {
1639
- return noop , fmt .Errorf ("decode docker config: %w" , err )
1673
+ return restoreEnv , fmt .Errorf ("decode docker config: %w" , err )
1640
1674
}
1641
1675
var configFile DockerConfig
1642
1676
decoded , err = hujson .Standardize (decoded )
1643
1677
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 )
1645
1679
}
1646
1680
err = json .Unmarshal (decoded , & configFile )
1647
1681
if err != nil {
1648
- return noop , fmt .Errorf ("parse docker config: %w" , err )
1682
+ return restoreEnv , fmt .Errorf ("parse docker config: %w" , err )
1649
1683
}
1650
1684
for k := range configFile .AuthConfigs {
1651
1685
logf (log .LevelInfo , "Docker config contains auth for registry %q" , k )
1652
1686
}
1653
1687
err = os .WriteFile (cfgPath , decoded , 0o644 )
1654
1688
if err != nil {
1655
- return noop , fmt .Errorf ("write docker config: %w" , err )
1689
+ return restoreEnv , fmt .Errorf ("write docker config: %w" , err )
1656
1690
}
1657
1691
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 {
1663
1694
var cleanupErr error
1664
1695
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 ()
1668
1697
// Remove the Docker config secret file!
1669
- if cleanupErr = os .Remove (cfgPath ); err != nil {
1698
+ if err : = os .Remove (cfgPath ); err != nil {
1670
1699
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 ) )
1672
1701
}
1673
1702
logf (log .LevelError , "Failed to remove the Docker config secret file: %s" , cleanupErr )
1703
+ cleanupErr = errors .Join (cleanupErr , err )
1674
1704
}
1675
1705
})
1676
1706
return cleanupErr
1677
- }
1678
- return cleanup , err
1707
+ }, nil
1679
1708
}
1680
1709
1681
1710
// Allows quick testing of layer caching using a local directory!
0 commit comments