@@ -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,85 @@ 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
+ )
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
+
1633
1668
if dockerConfigBase64 == "" {
1634
- return noop , nil
1669
+ return restoreEnv , nil
1635
1670
}
1636
- cfgPath := workingDir . Join ( "config.json" )
1671
+
1637
1672
decoded , err := base64 .StdEncoding .DecodeString (dockerConfigBase64 )
1638
1673
if err != nil {
1639
- return noop , fmt .Errorf ("decode docker config: %w" , err )
1674
+ return restoreEnv , fmt .Errorf ("decode docker config: %w" , err )
1640
1675
}
1641
1676
var configFile DockerConfig
1642
1677
decoded , err = hujson .Standardize (decoded )
1643
1678
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 )
1645
1680
}
1646
1681
err = json .Unmarshal (decoded , & configFile )
1647
1682
if err != nil {
1648
- return noop , fmt .Errorf ("parse docker config: %w" , err )
1683
+ return restoreEnv , fmt .Errorf ("parse docker config: %w" , err )
1649
1684
}
1650
1685
for k := range configFile .AuthConfigs {
1651
1686
logf (log .LevelInfo , "Docker config contains auth for registry %q" , k )
1652
1687
}
1653
1688
err = os .WriteFile (cfgPath , decoded , 0o644 )
1654
1689
if err != nil {
1655
- return noop , fmt .Errorf ("write docker config: %w" , err )
1690
+ return restoreEnv , fmt .Errorf ("write docker config: %w" , err )
1656
1691
}
1657
1692
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 {
1663
1695
var cleanupErr error
1664
1696
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 ()
1668
1698
// Remove the Docker config secret file!
1669
- if cleanupErr = os .Remove (cfgPath ); err != nil {
1699
+ if err : = os .Remove (cfgPath ); err != nil {
1670
1700
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 ) )
1672
1702
}
1673
1703
logf (log .LevelError , "Failed to remove the Docker config secret file: %s" , cleanupErr )
1704
+ cleanupErr = errors .Join (cleanupErr , err )
1674
1705
}
1675
1706
})
1676
1707
return cleanupErr
1677
- }
1678
- return cleanup , err
1708
+ }, nil
1679
1709
}
1680
1710
1681
1711
// Allows quick testing of layer caching using a local directory!
0 commit comments