diff options
author | baude <bbaude@redhat.com> | 2018-04-30 08:26:31 -0500 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2018-04-30 21:07:59 +0000 |
commit | 9924956dc88bf91a4d0bf09249ffb4cb960dee01 (patch) | |
tree | 19c45c97a8af4ef47a65d28dcbf9a6ce5e2d1f77 | |
parent | c8c39779a7919e78a97b97394930080885a41425 (diff) | |
download | podman-9924956dc88bf91a4d0bf09249ffb4cb960dee01.tar.gz podman-9924956dc88bf91a4d0bf09249ffb4cb960dee01.tar.bz2 podman-9924956dc88bf91a4d0bf09249ffb4cb960dee01.zip |
do not commit default volumes from container
when performing a container commit, we should not add the default list of volumes
for a container to the resulting image. it will cause the resulting image to crash
when run subsequently.
Signed-off-by: baude <bbaude@redhat.com>
Closes: #699
Approved by: mheon
-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)) + }) + }) |