Skip to content

Commit bca09c7

Browse files
authored
Merge pull request #6019 from thaJeztah/docker_auth_config_socket
cli/command/container: --use-api-socket: support DOCKER_AUTH_CONFIG
2 parents 267b5e7 + 73be734 commit bca09c7

2 files changed

Lines changed: 57 additions & 11 deletions

File tree

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package container
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"strings"
7+
8+
"github.com/docker/cli/cli/config"
9+
"github.com/docker/cli/cli/config/configfile"
10+
"github.com/docker/cli/cli/config/types"
11+
)
12+
13+
// readCredentials resolves auth-config from the current environment to be
14+
// applied to the container if the `--use-api-socket` flag is set.
15+
//
16+
// - If a valid "DOCKER_AUTH_CONFIG" env-var is found, and it contains
17+
// credentials, it's value is used.
18+
// - If no "DOCKER_AUTH_CONFIG" env-var is found, or it does not contain
19+
// credentials, it attempts to read from the CLI's credentials store.
20+
//
21+
// It returns an error if either the "DOCKER_AUTH_CONFIG" is incorrectly
22+
// formatted, or when failing to read from the credentials store.
23+
//
24+
// A nil value is returned if neither option contained any credentials.
25+
func readCredentials(dockerCLI config.Provider) (creds map[string]types.AuthConfig, _ error) {
26+
if v, ok := os.LookupEnv("DOCKER_AUTH_CONFIG"); ok && v != "" {
27+
// The results are expected to have been unmarshaled the same as
28+
// when reading from a config-file, which includes decoding the
29+
// base64-encoded "username:password" into the "UserName" and
30+
// "Password" fields.
31+
ac := &configfile.ConfigFile{}
32+
if err := ac.LoadFromReader(strings.NewReader(v)); err != nil {
33+
return nil, fmt.Errorf("failed to read credentials from DOCKER_AUTH_CONFIG: %w", err)
34+
}
35+
if len(ac.AuthConfigs) > 0 {
36+
return ac.AuthConfigs, nil
37+
}
38+
}
39+
40+
// Resolve this here for later, ensuring we error our before we create the container.
41+
creds, err := dockerCLI.ConfigFile().GetAllCredentials()
42+
if err != nil {
43+
return nil, fmt.Errorf("resolving credentials failed: %w", err)
44+
}
45+
return creds, nil
46+
}

cli/command/container/create.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -240,16 +240,6 @@ func createContainer(ctx context.Context, dockerCli command.Cli, containerCfg *c
240240
}
241241
}
242242

243-
pullAndTagImage := func() error {
244-
if err := pullImage(ctx, dockerCli, config.Image, options); err != nil {
245-
return err
246-
}
247-
if taggedRef, ok := namedRef.(reference.NamedTagged); ok && trustedRef != nil {
248-
return trust.TagTrusted(ctx, dockerCli.Client(), dockerCli.Err(), trustedRef, taggedRef)
249-
}
250-
return nil
251-
}
252-
253243
const dockerConfigPathInContainer = "/run/secrets/docker/config.json"
254244
var apiSocketCreds map[string]types.AuthConfig
255245

@@ -305,7 +295,7 @@ func createContainer(ctx context.Context, dockerCli command.Cli, containerCfg *c
305295
// what they're doing and don't inject the creds.
306296
if !envvarPresent {
307297
// Resolve this here for later, ensuring we error our before we create the container.
308-
creds, err := dockerCli.ConfigFile().GetAllCredentials()
298+
creds, err := readCredentials(dockerCli)
309299
if err != nil {
310300
return "", fmt.Errorf("resolving credentials failed: %w", err)
311301
}
@@ -331,6 +321,16 @@ func createContainer(ctx context.Context, dockerCli command.Cli, containerCfg *c
331321
platform = &p
332322
}
333323

324+
pullAndTagImage := func() error {
325+
if err := pullImage(ctx, dockerCli, config.Image, options); err != nil {
326+
return err
327+
}
328+
if taggedRef, ok := namedRef.(reference.NamedTagged); ok && trustedRef != nil {
329+
return trust.TagTrusted(ctx, dockerCli.Client(), dockerCli.Err(), trustedRef, taggedRef)
330+
}
331+
return nil
332+
}
333+
334334
if options.pull == PullImageAlways {
335335
if err := pullAndTagImage(); err != nil {
336336
return "", err

0 commit comments

Comments
 (0)