summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/podman/commit.go13
-rw-r--r--libpod/container_commit.go20
-rw-r--r--test/e2e/commit_test.go22
3 files changed, 47 insertions, 8 deletions
diff --git a/cmd/podman/commit.go b/cmd/podman/commit.go
index 14b7ddace..105ab2d99 100644
--- a/cmd/podman/commit.go
+++ b/cmd/podman/commit.go
@@ -1,6 +1,7 @@
package main
import (
+ "encoding/json"
"fmt"
"io"
"os"
@@ -120,7 +121,17 @@ func commitCmd(c *cli.Context) error {
Changes: c.StringSlice("change"),
Author: c.String("author"),
}
- newImage, err := ctr.Commit(getContext(), reference, options)
+ var createArtifact createConfig
+ artifact, err := ctr.GetArtifact("create-config")
+ if err == nil {
+ if err := json.Unmarshal(artifact, &createArtifact); err != nil {
+ return err
+ }
+ }
+ mounts := getMounts(createArtifact.Volumes, true)
+ command := createArtifact.Command
+ entryPoint := createArtifact.Entrypoint
+ newImage, err := ctr.Commit(getContext(), reference, options, strings.Split(mounts, ","), command, entryPoint)
if err != nil {
return err
}
diff --git a/libpod/container_commit.go b/libpod/container_commit.go
index a227e0987..e9004bcb2 100644
--- a/libpod/container_commit.go
+++ b/libpod/container_commit.go
@@ -26,7 +26,7 @@ type ContainerCommitOptions struct {
// Commit commits the changes between a container and its image, creating a new
// image
-func (c *Container) Commit(ctx context.Context, destImage string, options ContainerCommitOptions) (*image.Image, error) {
+func (c *Container) Commit(ctx context.Context, destImage string, options ContainerCommitOptions, mounts, command, entryPoint []string) (*image.Image, error) {
if !c.batched {
c.lock.Lock()
defer c.lock.Unlock()
@@ -74,11 +74,15 @@ func (c *Container) Commit(ctx context.Context, destImage string, options Contai
// add it to the resulting image.
// Entrypoint - always set this first or cmd will get wiped out
- importBuilder.SetEntrypoint(c.Spec().Process.Args)
+ if len(entryPoint) > 0 {
+ importBuilder.SetEntrypoint(entryPoint)
+ }
+
// Cmd
- // We cannot differentiate between cmd and entrypoint here
- // so we assign args to both
- importBuilder.SetCmd(c.Spec().Process.Args)
+ if len(command) > 0 {
+ importBuilder.SetCmd(command)
+ }
+
// Env
for _, e := range c.config.Spec.Process.Env {
splitEnv := strings.Split(e, "=")
@@ -96,8 +100,10 @@ func (c *Container) Commit(ctx context.Context, destImage string, options Contai
// User
importBuilder.SetUser(c.User())
// Volumes
- for _, v := range c.config.Spec.Mounts {
- importBuilder.AddVolume(v.Source)
+ for _, v := range mounts {
+ if v != "" {
+ importBuilder.AddVolume(v)
+ }
}
// Workdir
importBuilder.SetWorkDir(c.Spec().Process.Cwd)
diff --git a/test/e2e/commit_test.go b/test/e2e/commit_test.go
index 30f208f6f..f95a41896 100644
--- a/test/e2e/commit_test.go
+++ b/test/e2e/commit_test.go
@@ -110,4 +110,26 @@ var _ = Describe("Podman commit", func() {
check.WaitWithDefaultTimeout()
Expect(check.ExitCode()).To(Equal(0))
})
+
+ It("podman commit with volume mounts", func() {
+ s := podmanTest.Podman([]string{"run", "--name", "test1", "-v", "/tmp:/foo", "alpine", "date"})
+ s.WaitWithDefaultTimeout()
+ Expect(s.ExitCode()).To(Equal(0))
+
+ c := podmanTest.Podman([]string{"commit", "test1", "newimage"})
+ c.WaitWithDefaultTimeout()
+ Expect(c.ExitCode()).To(Equal(0))
+
+ inspect := podmanTest.Podman([]string{"inspect", "newimage"})
+ inspect.WaitWithDefaultTimeout()
+ Expect(inspect.ExitCode()).To(Equal(0))
+ image := inspect.InspectImageJSON()
+ _, ok := image[0].ContainerConfig.Volumes["/tmp"]
+ Expect(ok).To(BeTrue())
+
+ r := podmanTest.Podman([]string{"run", "newimage"})
+ r.WaitWithDefaultTimeout()
+ Expect(r.ExitCode()).To(Equal(0))
+ })
+
})