diff options
-rw-r--r-- | cmd/podman/commit.go | 13 | ||||
-rw-r--r-- | libpod/container_commit.go | 20 | ||||
-rw-r--r-- | test/e2e/commit_test.go | 22 |
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)) + }) + }) |