diff --git a/driver/docker/docker.go b/driver/docker/docker.go index 1ddde061..d6df47cf 100644 --- a/driver/docker/docker.go +++ b/driver/docker/docker.go @@ -3,7 +3,6 @@ package docker import ( "archive/tar" "context" - "errors" "fmt" "io" "io/ioutil" @@ -21,7 +20,6 @@ import ( "github.com/docker/docker/pkg/jsonmessage" "github.com/docker/docker/pkg/stdcopy" "github.com/docker/docker/registry" - copystructure "github.com/mitchellh/copystructure" ) // Driver is capable of running Docker invocation images using Docker itself. @@ -33,8 +31,8 @@ type Driver struct { dockerConfigurationOptions []ConfigurationOption containerOut io.Writer containerErr io.Writer - containerHostCfg *container.HostConfig - containerCfg *container.Config + containerHostCfg container.HostConfig + containerCfg container.Config } // Run executes the Docker driver @@ -54,34 +52,14 @@ func (d *Driver) AddConfigurationOptions(opts ...ConfigurationOption) { // GetContainerConfig returns a copy of the container configuration // used by the driver during container exec -func (d *Driver) GetContainerConfig() (container.Config, error) { - cpy, err := copystructure.Copy(*d.containerCfg) - if err != nil { - return container.Config{}, err - } - - containerCfg, ok := cpy.(container.Config) - if !ok { - return container.Config{}, errors.New("unable to process container config") - } - - return containerCfg, nil +func (d *Driver) GetContainerConfig() container.Config { + return d.containerCfg } // GetContainerHostConfig returns a copy of the container host configuration // used by the driver during container exec -func (d *Driver) GetContainerHostConfig() (container.HostConfig, error) { - cpy, err := copystructure.Copy(*d.containerHostCfg) - if err != nil { - return container.HostConfig{}, err - } - - hostCfg, ok := cpy.(container.HostConfig) - if !ok { - return container.HostConfig{}, errors.New("unable to process container host config") - } - - return hostCfg, nil +func (d *Driver) GetContainerHostConfig() container.HostConfig { + return d.containerHostCfg } // Config returns the Docker driver configuration options @@ -191,7 +169,7 @@ func (d *Driver) exec(op *driver.Operation) (driver.OperationResult, error) { env = append(env, fmt.Sprintf("%s=%v", k, v)) } - d.containerCfg = &container.Config{ + d.containerCfg = container.Config{ Image: op.Image.Image, Env: env, Entrypoint: strslice.StrSlice{"/cnab/app/run"}, @@ -199,19 +177,19 @@ func (d *Driver) exec(op *driver.Operation) (driver.OperationResult, error) { AttachStdout: true, } - d.containerHostCfg = &container.HostConfig{} + d.containerHostCfg = container.HostConfig{} if err := d.ApplyConfigurationOptions(); err != nil { return driver.OperationResult{}, err } - resp, err := cli.Client().ContainerCreate(ctx, d.containerCfg, d.containerHostCfg, nil, "") + resp, err := cli.Client().ContainerCreate(ctx, &d.containerCfg, &d.containerHostCfg, nil, "") switch { case client.IsErrNotFound(err): fmt.Fprintf(cli.Err(), "Unable to find image '%s' locally\n", op.Image.Image) if err := pullImage(ctx, cli, op.Image.Image); err != nil { return driver.OperationResult{}, err } - if resp, err = cli.Client().ContainerCreate(ctx, d.containerCfg, d.containerHostCfg, nil, ""); err != nil { + if resp, err = cli.Client().ContainerCreate(ctx, &d.containerCfg, &d.containerHostCfg, nil, ""); err != nil { return driver.OperationResult{}, fmt.Errorf("cannot create container: %v", err) } case err != nil: @@ -296,7 +274,7 @@ func (d *Driver) exec(op *driver.Operation) (driver.OperationResult, error) { // ApplyConfigurationOptions applies the configuration options set on the driver func (d *Driver) ApplyConfigurationOptions() error { for _, opt := range d.dockerConfigurationOptions { - if err := opt(d.containerCfg, d.containerHostCfg); err != nil { + if err := opt(&d.containerCfg, &d.containerHostCfg); err != nil { return err } } diff --git a/driver/docker/docker_test.go b/driver/docker/docker_test.go index 4a6ce62d..91bf7644 100644 --- a/driver/docker/docker_test.go +++ b/driver/docker/docker_test.go @@ -14,25 +14,18 @@ func TestDriver_GetConfigurationOptions(t *testing.T) { is.NotNil(d) is.True(d.Handles(driver.ImageTypeDocker)) - t.Run("no configuration options", func(t *testing.T) { - d.containerCfg = &container.Config{} - d.containerHostCfg = &container.HostConfig{} - + t.Run("empty configuration options", func(t *testing.T) { err := d.ApplyConfigurationOptions() is.NoError(err) - cfg, err := d.GetContainerConfig() - is.NoError(err) + cfg := d.GetContainerConfig() is.Equal(container.Config{}, cfg) - hostCfg, err := d.GetContainerHostConfig() - is.NoError(err) + hostCfg := d.GetContainerHostConfig() is.Equal(container.HostConfig{}, hostCfg) }) t.Run("configuration options", func(t *testing.T) { - d.containerCfg = &container.Config{} - d.containerHostCfg = &container.HostConfig{} d.AddConfigurationOptions(func(cfg *container.Config, hostCfg *container.HostConfig) error { cfg.User = "cnabby" hostCfg.Privileged = true @@ -49,12 +42,10 @@ func TestDriver_GetConfigurationOptions(t *testing.T) { Privileged: true, } - cfg, err := d.GetContainerConfig() - is.NoError(err) + cfg := d.GetContainerConfig() is.Equal(expectedContainerCfg, cfg) - hostCfg, err := d.GetContainerHostConfig() - is.NoError(err) + hostCfg := d.GetContainerHostConfig() is.Equal(expectedHostCfg, hostCfg) }) }