@@ -2,14 +2,57 @@ package runner
22
33import (
44 "context"
5+ "encoding/json"
56 "io"
7+ "os"
8+ "os/user"
9+ "path/filepath"
610 "time"
711
8- "github.com/fsouza/go-dockerclient"
12+ "github.com/docker/docker/cli/config/configfile"
13+ docker "github.com/fsouza/go-dockerclient"
914 "github.com/iron-io/functions/api/runner/task"
1015 "github.com/iron-io/runner/drivers"
1116)
1217
18+ var registries dockerRegistries
19+
20+ func init () {
21+
22+ // Attempt to fetch it from an environment variable
23+ regsettings := os .Getenv ("DOCKER_AUTH" )
24+
25+ if regsettings == "" {
26+ u , err := user .Current ()
27+ if err == nil {
28+ var config configfile.ConfigFile
29+ cfile , err := os .Open (filepath .Join (u .HomeDir , ".docker" , "config.json" ))
30+ if err != nil {
31+ return
32+ }
33+ err = config .LoadFromReader (cfile )
34+ if err != nil {
35+ return
36+ }
37+
38+ var regs []dockerRegistry
39+ for _ , auth := range config .AuthConfigs {
40+ regs = append (regs , dockerRegistry {
41+ Username : auth .Username ,
42+ Password : auth .Password ,
43+ Name : auth .ServerAddress ,
44+ })
45+ }
46+
47+ registries = dockerRegistries (regs )
48+ }
49+ } else {
50+ // If we have settings, unmarshal them
51+ json .Unmarshal ([]byte (regsettings ), & registries )
52+ }
53+
54+ }
55+
1356type containerTask struct {
1457 ctx context.Context
1558 cfg * task.Config
@@ -31,17 +74,31 @@ func (t *containerTask) Labels() map[string]string {
3174 }
3275}
3376
34- func (t * containerTask ) Id () string { return t .cfg .ID }
35- func (t * containerTask ) Route () string { return "" }
36- func (t * containerTask ) Image () string { return t .cfg .Image }
37- func (t * containerTask ) Timeout () time.Duration { return t .cfg .Timeout }
38- func (t * containerTask ) IdleTimeout () time.Duration { return t .cfg .IdleTimeout }
39- func (t * containerTask ) Logger () (io.Writer , io.Writer ) { return t .cfg .Stdout , t .cfg .Stderr }
40- func (t * containerTask ) Volumes () [][2 ]string { return [][2 ]string {} }
41- func (t * containerTask ) WorkDir () string { return "" }
77+ func (t * containerTask ) Id () string { return t .cfg .ID }
78+ func (t * containerTask ) Route () string { return "" }
79+ func (t * containerTask ) Image () string { return t .cfg .Image }
80+ func (t * containerTask ) Timeout () time.Duration { return t .cfg .Timeout }
81+ func (t * containerTask ) IdleTimeout () time.Duration { return t .cfg .IdleTimeout }
82+ func (t * containerTask ) Logger () (io.Writer , io.Writer ) { return t .cfg .Stdout , t .cfg .Stderr }
83+ func (t * containerTask ) Volumes () [][2 ]string { return [][2 ]string {} }
84+ func (t * containerTask ) WorkDir () string { return "" }
4285
4386func (t * containerTask ) Close () {}
4487func (t * containerTask ) WriteStat (drivers.Stat ) {}
4588
46- // FIXME: for now just use empty creds => public docker hub image
47- func (t * containerTask ) DockerAuth () docker.AuthConfiguration { return docker.AuthConfiguration {} }
89+ // Implementing the docker.AuthConfiguration interface. Pulling in
90+ // the docker repo password from environment variables
91+ func (t * containerTask ) DockerAuth () (docker.AuthConfiguration , error ) {
92+ reg , _ , _ := drivers .ParseImage (t .Image ())
93+ authconfig := docker.AuthConfiguration {}
94+
95+ if customAuth := registries .Find (reg ); customAuth != nil {
96+ authconfig = docker.AuthConfiguration {
97+ Password : customAuth .Password ,
98+ ServerAddress : customAuth .Name ,
99+ Username : customAuth .Username ,
100+ }
101+ }
102+
103+ return authconfig , nil
104+ }
0 commit comments