Skip to content

Commit 1db08a3

Browse files
Merge pull request #206 from vdice/fix/container-config
ref(docker.go): container config fields on Driver no longer pointers
2 parents bc0cd79 + 5395191 commit 1db08a3

File tree

2 files changed

+52
-26
lines changed

2 files changed

+52
-26
lines changed

driver/docker/docker.go

+17-16
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121
"github.com/docker/docker/pkg/jsonmessage"
2222
"github.com/docker/docker/pkg/stdcopy"
2323
"github.com/docker/docker/registry"
24-
copystructure "github.com/mitchellh/copystructure"
24+
"github.com/mitchellh/copystructure"
2525
)
2626

2727
// Driver is capable of running Docker invocation images using Docker itself.
@@ -33,8 +33,8 @@ type Driver struct {
3333
dockerConfigurationOptions []ConfigurationOption
3434
containerOut io.Writer
3535
containerErr io.Writer
36-
containerHostCfg *container.HostConfig
37-
containerCfg *container.Config
36+
containerHostCfg container.HostConfig
37+
containerCfg container.Config
3838
}
3939

4040
// Run executes the Docker driver
@@ -55,33 +55,33 @@ func (d *Driver) AddConfigurationOptions(opts ...ConfigurationOption) {
5555
// GetContainerConfig returns a copy of the container configuration
5656
// used by the driver during container exec
5757
func (d *Driver) GetContainerConfig() (container.Config, error) {
58-
cpy, err := copystructure.Copy(*d.containerCfg)
58+
cpy, err := copystructure.Copy(d.containerCfg)
5959
if err != nil {
6060
return container.Config{}, err
6161
}
6262

63-
containerCfg, ok := cpy.(container.Config)
63+
cfg, ok := cpy.(container.Config)
6464
if !ok {
6565
return container.Config{}, errors.New("unable to process container config")
6666
}
6767

68-
return containerCfg, nil
68+
return cfg, nil
6969
}
7070

7171
// GetContainerHostConfig returns a copy of the container host configuration
7272
// used by the driver during container exec
7373
func (d *Driver) GetContainerHostConfig() (container.HostConfig, error) {
74-
cpy, err := copystructure.Copy(*d.containerHostCfg)
74+
cpy, err := copystructure.Copy(d.containerHostCfg)
7575
if err != nil {
7676
return container.HostConfig{}, err
7777
}
7878

79-
hostCfg, ok := cpy.(container.HostConfig)
79+
cfg, ok := cpy.(container.HostConfig)
8080
if !ok {
8181
return container.HostConfig{}, errors.New("unable to process container host config")
8282
}
8383

84-
return hostCfg, nil
84+
return cfg, nil
8585
}
8686

8787
// Config returns the Docker driver configuration options
@@ -191,27 +191,27 @@ func (d *Driver) exec(op *driver.Operation) (driver.OperationResult, error) {
191191
env = append(env, fmt.Sprintf("%s=%v", k, v))
192192
}
193193

194-
d.containerCfg = &container.Config{
194+
d.containerCfg = container.Config{
195195
Image: op.Image.Image,
196196
Env: env,
197197
Entrypoint: strslice.StrSlice{"/cnab/app/run"},
198198
AttachStderr: true,
199199
AttachStdout: true,
200200
}
201201

202-
d.containerHostCfg = &container.HostConfig{}
203-
if err := d.applyConfigurationOptions(); err != nil {
202+
d.containerHostCfg = container.HostConfig{}
203+
if err := d.ApplyConfigurationOptions(); err != nil {
204204
return driver.OperationResult{}, err
205205
}
206206

207-
resp, err := cli.Client().ContainerCreate(ctx, d.containerCfg, d.containerHostCfg, nil, "")
207+
resp, err := cli.Client().ContainerCreate(ctx, &d.containerCfg, &d.containerHostCfg, nil, "")
208208
switch {
209209
case client.IsErrNotFound(err):
210210
fmt.Fprintf(cli.Err(), "Unable to find image '%s' locally\n", op.Image.Image)
211211
if err := pullImage(ctx, cli, op.Image.Image); err != nil {
212212
return driver.OperationResult{}, err
213213
}
214-
if resp, err = cli.Client().ContainerCreate(ctx, d.containerCfg, d.containerHostCfg, nil, ""); err != nil {
214+
if resp, err = cli.Client().ContainerCreate(ctx, &d.containerCfg, &d.containerHostCfg, nil, ""); err != nil {
215215
return driver.OperationResult{}, fmt.Errorf("cannot create container: %v", err)
216216
}
217217
case err != nil:
@@ -293,9 +293,10 @@ func (d *Driver) exec(op *driver.Operation) (driver.OperationResult, error) {
293293
return opResult, err
294294
}
295295

296-
func (d *Driver) applyConfigurationOptions() error {
296+
// ApplyConfigurationOptions applies the configuration options set on the driver
297+
func (d *Driver) ApplyConfigurationOptions() error {
297298
for _, opt := range d.dockerConfigurationOptions {
298-
if err := opt(d.containerCfg, d.containerHostCfg); err != nil {
299+
if err := opt(&d.containerCfg, &d.containerHostCfg); err != nil {
299300
return err
300301
}
301302
}

driver/docker/docker_test.go

+35-10
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,19 @@ import (
55

66
"github.com/cnabio/cnab-go/driver"
77
"github.com/docker/docker/api/types/container"
8+
"github.com/docker/docker/api/types/strslice"
89
"github.com/stretchr/testify/assert"
910
)
1011

1112
func TestDriver_GetConfigurationOptions(t *testing.T) {
12-
d := &Driver{}
1313
is := assert.New(t)
14-
is.NotNil(d)
15-
is.True(d.Handles(driver.ImageTypeDocker))
1614

17-
t.Run("no configuration options", func(t *testing.T) {
18-
d.containerCfg = &container.Config{}
19-
d.containerHostCfg = &container.HostConfig{}
15+
t.Run("empty configuration options", func(t *testing.T) {
16+
d := &Driver{}
17+
is.NotNil(d)
18+
is.True(d.Handles(driver.ImageTypeDocker))
2019

21-
err := d.applyConfigurationOptions()
20+
err := d.ApplyConfigurationOptions()
2221
is.NoError(err)
2322

2423
cfg, err := d.GetContainerConfig()
@@ -31,15 +30,15 @@ func TestDriver_GetConfigurationOptions(t *testing.T) {
3130
})
3231

3332
t.Run("configuration options", func(t *testing.T) {
34-
d.containerCfg = &container.Config{}
35-
d.containerHostCfg = &container.HostConfig{}
33+
d := &Driver{}
34+
3635
d.AddConfigurationOptions(func(cfg *container.Config, hostCfg *container.HostConfig) error {
3736
cfg.User = "cnabby"
3837
hostCfg.Privileged = true
3938
return nil
4039
})
4140

42-
err := d.applyConfigurationOptions()
41+
err := d.ApplyConfigurationOptions()
4342
is.NoError(err)
4443

4544
expectedContainerCfg := container.Config{
@@ -57,4 +56,30 @@ func TestDriver_GetConfigurationOptions(t *testing.T) {
5756
is.NoError(err)
5857
is.Equal(expectedHostCfg, hostCfg)
5958
})
59+
60+
t.Run("configuration options - no unintentional modification", func(t *testing.T) {
61+
d := &Driver{}
62+
63+
d.AddConfigurationOptions(func(cfg *container.Config, hostCfg *container.HostConfig) error {
64+
hostCfg.CapAdd = strslice.StrSlice{"SUPER_POWERS"}
65+
return nil
66+
})
67+
68+
err := d.ApplyConfigurationOptions()
69+
is.NoError(err)
70+
71+
expectedHostCfg := container.HostConfig{
72+
CapAdd: strslice.StrSlice{"SUPER_POWERS"},
73+
}
74+
75+
hostCfg, err := d.GetContainerHostConfig()
76+
is.NoError(err)
77+
is.Equal(expectedHostCfg, hostCfg)
78+
79+
hostCfg.CapAdd[0] = "NORMAL_POWERS"
80+
81+
hostCfg, err = d.GetContainerHostConfig()
82+
is.NoError(err)
83+
is.Equal(expectedHostCfg, hostCfg)
84+
})
6085
}

0 commit comments

Comments
 (0)