diff --git a/builder/docker/config.go b/builder/docker/config.go index 236a3060d..62585ae41 100644 --- a/builder/docker/config.go +++ b/builder/docker/config.go @@ -32,6 +32,7 @@ type Config struct { RunCommand []string `mapstructure:"run_command"` Volumes map[string]string Privileged bool `mapstructure:"privileged"` + Changes []string // This is used to login to dockerhub to pull a private base container. For // pushing to dockerhub, see the docker post-processors diff --git a/builder/docker/driver.go b/builder/docker/driver.go index 850bd98dd..1d238513d 100644 --- a/builder/docker/driver.go +++ b/builder/docker/driver.go @@ -11,7 +11,7 @@ import ( // a mock driver can be shimmed in. type Driver interface { // Commit the container to a tag - Commit(id string) (string, error) + Commit(id string, changes []string) (string, error) // Delete an image that is imported into Docker DeleteImage(id string) error diff --git a/builder/docker/driver_docker.go b/builder/docker/driver_docker.go index 172574e78..a85c987c2 100644 --- a/builder/docker/driver_docker.go +++ b/builder/docker/driver_docker.go @@ -42,11 +42,17 @@ func (d *DockerDriver) DeleteImage(id string) error { return nil } -func (d *DockerDriver) Commit(id string) (string, error) { +func (d *DockerDriver) Commit(id string, changes []string) (string, error) { var stdout bytes.Buffer var stderr bytes.Buffer - cmd := exec.Command("docker", "commit", id) + args := []string{"commit"} + for _, change := range changes { + args = append(args, "--change", change) + } + args = append(args, id) + + cmd := exec.Command("docker", args...) cmd.Stdout = &stdout cmd.Stderr = &stderr diff --git a/builder/docker/driver_mock.go b/builder/docker/driver_mock.go index b0170f85f..918063f53 100644 --- a/builder/docker/driver_mock.go +++ b/builder/docker/driver_mock.go @@ -76,7 +76,7 @@ type MockDriver struct { VersionVersion string } -func (d *MockDriver) Commit(id string) (string, error) { +func (d *MockDriver) Commit(id string, changes []string) (string, error) { d.CommitCalled = true d.CommitContainerId = id return d.CommitImageId, d.CommitErr diff --git a/builder/docker/step_commit.go b/builder/docker/step_commit.go index bd1277182..8d664c7ed 100644 --- a/builder/docker/step_commit.go +++ b/builder/docker/step_commit.go @@ -14,10 +14,11 @@ type StepCommit struct { func (s *StepCommit) Run(state multistep.StateBag) multistep.StepAction { driver := state.Get("driver").(Driver) containerId := state.Get("container_id").(string) + config := state.Get("config").(*Config) ui := state.Get("ui").(packer.Ui) ui.Say("Committing the container") - imageId, err := driver.Commit(containerId) + imageId, err := driver.Commit(containerId, config.Changes) if err != nil { state.Put("error", err) ui.Error(err.Error())