Skip to content

Commit 24e1f96

Browse files
committed
Refactor ProxyConfig
Signed-off-by: Sebastiaan van Stijn <[email protected]>
1 parent cc6a92c commit 24e1f96

6 files changed

Lines changed: 92 additions & 45 deletions

File tree

cli/command/container/create.go

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"github.com/docker/cli/cli"
1010
"github.com/docker/cli/cli/command"
1111
"github.com/docker/cli/cli/command/image"
12-
"github.com/docker/cli/opts"
1312
"github.com/docker/distribution/reference"
1413
"github.com/docker/docker/api/types"
1514
"github.com/docker/docker/api/types/container"
@@ -60,23 +59,18 @@ func NewCreateCommand(dockerCli command.Cli) *cobra.Command {
6059
return cmd
6160
}
6261

63-
func runCreate(dockerCli command.Cli, flags *pflag.FlagSet, options *createOptions, copts *containerOptions) error {
64-
proxyConfig := dockerCli.ConfigFile().ParseProxyConfig(dockerCli.Client().DaemonHost(), copts.env.GetAll())
65-
newEnv := []string{}
66-
for k, v := range proxyConfig {
67-
if v == nil {
68-
newEnv = append(newEnv, k)
69-
} else {
70-
newEnv = append(newEnv, fmt.Sprintf("%s=%s", k, *v))
71-
}
62+
func runCreate(dockerCli command.Cli, flags *pflag.FlagSet, opts *createOptions, copts *containerOptions) error {
63+
proxyConfg := dockerCli.ConfigFile().GetProxyConfig(dockerCli.Client().DaemonHost())
64+
if err := applyProxyConfig(copts.env, proxyConfg); err != nil {
65+
return err
7266
}
73-
copts.env = *opts.NewListOptsRef(&newEnv, nil)
67+
7468
containerConfig, err := parse(flags, copts)
7569
if err != nil {
7670
reportError(dockerCli.Err(), "create", err.Error(), true)
7771
return cli.StatusError{StatusCode: 125}
7872
}
79-
response, err := createContainer(context.Background(), dockerCli, containerConfig, options)
73+
response, err := createContainer(context.Background(), dockerCli, containerConfig, opts)
8074
if err != nil {
8175
return err
8276
}

cli/command/container/create_test.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,6 @@ func TestCreateContainerWithProxyConfig(t *testing.T) {
187187
networkingConfig *network.NetworkingConfig,
188188
containerName string,
189189
) (container.ContainerCreateCreatedBody, error) {
190-
sort.Strings(config.Env)
191190
assert.DeepEqual(t, config.Env, expected)
192191
return container.ContainerCreateCreatedBody{}, nil
193192
},

cli/command/container/opts.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"io/ioutil"
88
"path"
99
"regexp"
10+
"sort"
1011
"strconv"
1112
"strings"
1213
"time"
@@ -869,3 +870,27 @@ func validateAttach(val string) (string, error) {
869870
}
870871
return val, errors.Errorf("valid streams are STDIN, STDOUT and STDERR")
871872
}
873+
874+
// applyProxyConfig sets proxy environment variables for the container. If a proxy
875+
// environment variable is already set, the existing environment variable is used.
876+
func applyProxyConfig(env opts.ListOpts, proxies map[string]*string) error {
877+
keys := make([]string, 0, len(proxies))
878+
for k := range proxies {
879+
keys = append(keys, k)
880+
}
881+
sort.Strings(keys)
882+
883+
m := opts.ConvertKVStringsToMapWithNil(env.GetAll())
884+
for _, k := range keys {
885+
if *proxies[k] == "" {
886+
continue
887+
}
888+
if _, ok := m[k]; ok {
889+
continue
890+
}
891+
if err := env.Set(k + "=" + *proxies[k]); err != nil {
892+
return err
893+
}
894+
}
895+
return nil
896+
}

cli/command/container/run.go

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313

1414
"github.com/docker/cli/cli"
1515
"github.com/docker/cli/cli/command"
16-
"github.com/docker/cli/opts"
1716
"github.com/docker/docker/api/types"
1817
"github.com/docker/docker/api/types/container"
1918
"github.com/docker/docker/pkg/signal"
@@ -98,16 +97,11 @@ func isLocalhost(ip string) bool {
9897
}
9998

10099
func runRun(dockerCli command.Cli, flags *pflag.FlagSet, ropts *runOptions, copts *containerOptions) error {
101-
proxyConfig := dockerCli.ConfigFile().ParseProxyConfig(dockerCli.Client().DaemonHost(), copts.env.GetAll())
102-
newEnv := []string{}
103-
for k, v := range proxyConfig {
104-
if v == nil {
105-
newEnv = append(newEnv, k)
106-
} else {
107-
newEnv = append(newEnv, fmt.Sprintf("%s=%s", k, *v))
108-
}
100+
proxyConfg := dockerCli.ConfigFile().GetProxyConfig(dockerCli.Client().DaemonHost())
101+
if err := applyProxyConfig(copts.env, proxyConfg); err != nil {
102+
return err
109103
}
110-
copts.env = *opts.NewListOptsRef(&newEnv, nil)
104+
111105
containerConfig, err := parse(flags, copts)
112106
// just in case the parse does not exit
113107
if err != nil {

cli/command/image/build.go

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"path/filepath"
1414
"regexp"
1515
"runtime"
16+
"sort"
1617
"strings"
1718

1819
"github.com/docker/cli/cli"
@@ -384,7 +385,11 @@ func runBuild(dockerCli command.Cli, options buildOptions) error {
384385

385386
configFile := dockerCli.ConfigFile()
386387
authConfigs, _ := configFile.GetAllCredentials()
387-
buildOptions := imageBuildOptions(dockerCli, options)
388+
proxyConfg := configFile.GetProxyConfig(dockerCli.Client().DaemonHost())
389+
if err := applyProxyConfig(options.buildArgs, proxyConfg); err != nil {
390+
return err
391+
}
392+
buildOptions := imageBuildOptions(options)
388393
buildOptions.Version = types.BuilderV1
389394
buildOptions.Dockerfile = relDockerfile
390395
buildOptions.AuthConfigs = authConfigs
@@ -599,8 +604,7 @@ func replaceDockerfileForContentTrust(ctx context.Context, inputTarStream io.Rea
599604
return pipeReader
600605
}
601606

602-
func imageBuildOptions(dockerCli command.Cli, options buildOptions) types.ImageBuildOptions {
603-
configFile := dockerCli.ConfigFile()
607+
func imageBuildOptions(options buildOptions) types.ImageBuildOptions {
604608
return types.ImageBuildOptions{
605609
Memory: options.memory.Value(),
606610
MemorySwap: options.memorySwap.Value(),
@@ -619,7 +623,7 @@ func imageBuildOptions(dockerCli command.Cli, options buildOptions) types.ImageB
619623
CgroupParent: options.cgroupParent,
620624
ShmSize: options.shmSize.Value(),
621625
Ulimits: options.ulimits.GetList(),
622-
BuildArgs: configFile.ParseProxyConfig(dockerCli.Client().DaemonHost(), options.buildArgs.GetAll()),
626+
BuildArgs: opts.ConvertKVStringsToMapWithNil(options.buildArgs.GetAll()),
623627
Labels: opts.ConvertKVStringsToMap(options.labels.GetAll()),
624628
CacheFrom: options.cacheFrom,
625629
SecurityOpt: options.securityOpt,
@@ -630,3 +634,27 @@ func imageBuildOptions(dockerCli command.Cli, options buildOptions) types.ImageB
630634
Platform: options.platform,
631635
}
632636
}
637+
638+
// applyProxyConfig sets proxy environment variables for the container. If a proxy
639+
// environment variable is already set, the existing environment variable is used.
640+
func applyProxyConfig(env opts.ListOpts, proxies map[string]*string) error {
641+
keys := make([]string, 0, len(proxies))
642+
for k := range proxies {
643+
keys = append(keys, k)
644+
}
645+
sort.Strings(keys)
646+
647+
m := opts.ConvertKVStringsToMapWithNil(env.GetAll())
648+
for _, k := range keys {
649+
if *proxies[k] == "" {
650+
continue
651+
}
652+
if _, ok := m[k]; ok {
653+
continue
654+
}
655+
if err := env.Set(k + "=" + *proxies[k]); err != nil {
656+
return err
657+
}
658+
}
659+
return nil
660+
}

cli/config/configfile/file.go

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -195,34 +195,41 @@ func (configFile *ConfigFile) Save() error {
195195
// ParseProxyConfig computes proxy configuration by retrieving the config for the provided host and
196196
// then checking this against any environment variables provided to the container
197197
func (configFile *ConfigFile) ParseProxyConfig(host string, runOpts []string) map[string]*string {
198-
var cfgKey string
198+
m := opts.ConvertKVStringsToMapWithNil(runOpts)
199+
for k, v := range configFile.GetProxyConfig(host) {
200+
if *v == "" {
201+
continue
202+
}
203+
if _, ok := m[k]; !ok {
204+
m[k] = v
205+
}
206+
if _, ok := m[strings.ToLower(k)]; !ok {
207+
m[strings.ToLower(k)] = v
208+
}
209+
}
210+
return m
211+
}
199212

213+
// GetProxyConfig returns the proxy configuration for the provided host, or the
214+
// default proxy configuration if no configuration was found for the provided host.
215+
func (configFile *ConfigFile) GetProxyConfig(host string) map[string]*string {
216+
var config ProxyConfig
200217
if _, ok := configFile.Proxies[host]; !ok {
201-
cfgKey = "default"
218+
config = configFile.Proxies["default"]
202219
} else {
203-
cfgKey = host
220+
config = configFile.Proxies[host]
204221
}
205222

206-
config := configFile.Proxies[cfgKey]
207-
permitted := map[string]*string{
223+
return map[string]*string{
208224
"HTTP_PROXY": &config.HTTPProxy,
225+
"http_proxy": &config.HTTPProxy,
209226
"HTTPS_PROXY": &config.HTTPSProxy,
227+
"https_proxy": &config.HTTPSProxy,
210228
"NO_PROXY": &config.NoProxy,
229+
"no_proxy": &config.NoProxy,
211230
"FTP_PROXY": &config.FTPProxy,
231+
"ftp_proxy": &config.FTPProxy,
212232
}
213-
m := opts.ConvertKVStringsToMapWithNil(runOpts)
214-
for k := range permitted {
215-
if *permitted[k] == "" {
216-
continue
217-
}
218-
if _, ok := m[k]; !ok {
219-
m[k] = permitted[k]
220-
}
221-
if _, ok := m[strings.ToLower(k)]; !ok {
222-
m[strings.ToLower(k)] = permitted[k]
223-
}
224-
}
225-
return m
226233
}
227234

228235
// encodeAuth creates a base64 encoded string to containing authorization information

0 commit comments

Comments
 (0)