mirror of
https://github.com/containers/podman.git
synced 2025-08-06 03:19:52 +08:00
Fix podman command --change CMD
Currently in Docker if you commit with --change 'CMD a b c' The command that gets added is [/bin/sh -c "a b c"] If you commit --change 'CMD ["a","b","c"]' You get [a b c] This patch set makes podman match this behaviour. Similar change required for Entrypoint. Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
This commit is contained in:
@ -42,7 +42,7 @@ func init() {
|
||||
commitCommand.SetHelpTemplate(HelpTemplate())
|
||||
commitCommand.SetUsageTemplate(UsageTemplate())
|
||||
flags := commitCommand.Flags()
|
||||
flags.StringSliceVarP(&commitCommand.Change, "change", "c", []string{}, fmt.Sprintf("Apply the following possible instructions to the created image (default []): %s", strings.Join(libpod.ChangeCmds, " | ")))
|
||||
flags.StringArrayVarP(&commitCommand.Change, "change", "c", []string{}, fmt.Sprintf("Apply the following possible instructions to the created image (default []): %s", strings.Join(libpod.ChangeCmds, " | ")))
|
||||
flags.StringVarP(&commitCommand.Format, "format", "f", "oci", "`Format` of the image manifest and metadata")
|
||||
flags.StringVarP(&commitCommand.Message, "message", "m", "", "Set commit message for imported image")
|
||||
flags.StringVarP(&commitCommand.Author, "author", "a", "", "Set the author for the image committed")
|
||||
@ -83,6 +83,9 @@ func commitCmd(c *cliconfig.CommitValues) error {
|
||||
if c.Flag("change").Changed {
|
||||
for _, change := range c.Change {
|
||||
splitChange := strings.Split(strings.ToUpper(change), "=")
|
||||
if len(splitChange) == 1 {
|
||||
splitChange = strings.Split(strings.ToUpper(change), " ")
|
||||
}
|
||||
if !util.StringInSlice(splitChange[0], libpod.ChangeCmds) {
|
||||
return errors.Errorf("invalid syntax for --change: %s", change)
|
||||
}
|
||||
|
@ -125,23 +125,48 @@ func (c *Container) Commit(ctx context.Context, destImage string, options Contai
|
||||
// Workdir
|
||||
importBuilder.SetWorkDir(c.Spec().Process.Cwd)
|
||||
|
||||
genCmd := func(cmd string) []string {
|
||||
trim := func(cmd []string) []string {
|
||||
if len(cmd) == 0 {
|
||||
return cmd
|
||||
}
|
||||
|
||||
retCmd := []string{}
|
||||
for _, c := range cmd {
|
||||
if len(c) >= 2 {
|
||||
if c[0] == '"' && c[len(c)-1] == '"' {
|
||||
retCmd = append(retCmd, c[1:len(c)-1])
|
||||
continue
|
||||
}
|
||||
}
|
||||
retCmd = append(retCmd, c)
|
||||
}
|
||||
return retCmd
|
||||
}
|
||||
if strings.HasPrefix(cmd, "[") {
|
||||
cmd = strings.TrimPrefix(cmd, "[")
|
||||
cmd = strings.TrimSuffix(cmd, "]")
|
||||
return trim(strings.Split(cmd, ","))
|
||||
}
|
||||
return []string{"/bin/sh", "-c", cmd}
|
||||
}
|
||||
// Process user changes
|
||||
for _, change := range options.Changes {
|
||||
splitChange := strings.SplitN(change, " ", 2)
|
||||
splitChange := strings.SplitN(change, "=", 2)
|
||||
if len(splitChange) != 2 {
|
||||
splitChange = strings.SplitN(change, "=", 2)
|
||||
splitChange = strings.SplitN(change, " ", 2)
|
||||
if len(splitChange) < 2 {
|
||||
return nil, errors.Errorf("invalid change %s format", change)
|
||||
}
|
||||
}
|
||||
|
||||
change := strings.Split(splitChange[1], " ")
|
||||
switch strings.ToUpper(splitChange[0]) {
|
||||
case "CMD":
|
||||
importBuilder.SetCmd(change)
|
||||
importBuilder.SetCmd(genCmd(splitChange[1]))
|
||||
case "ENTRYPOINT":
|
||||
importBuilder.SetEntrypoint(change)
|
||||
importBuilder.SetEntrypoint(genCmd(splitChange[1]))
|
||||
case "ENV":
|
||||
change := strings.Split(splitChange[1], " ")
|
||||
name := change[0]
|
||||
val := ""
|
||||
if len(change) < 2 {
|
||||
@ -168,6 +193,7 @@ func (c *Container) Commit(ctx context.Context, destImage string, options Contai
|
||||
}
|
||||
importBuilder.SetPort(splitChange[1])
|
||||
case "LABEL":
|
||||
change := strings.Split(splitChange[1], " ")
|
||||
if len(change) < 2 {
|
||||
change = strings.Split(change[0], "=")
|
||||
}
|
||||
|
@ -117,6 +117,31 @@ var _ = Describe("Podman commit", func() {
|
||||
Expect(foundBlue).To(Equal(true))
|
||||
})
|
||||
|
||||
It("podman commit container with change CMD flag", func() {
|
||||
test := podmanTest.Podman([]string{"run", "--name", "test1", "-d", ALPINE, "ls"})
|
||||
test.WaitWithDefaultTimeout()
|
||||
Expect(test.ExitCode()).To(Equal(0))
|
||||
Expect(podmanTest.NumberOfContainers()).To(Equal(1))
|
||||
|
||||
session := podmanTest.Podman([]string{"commit", "--change", "CMD a b c", "test1", "foobar.com/test1-image:latest"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
|
||||
session = podmanTest.Podman([]string{"inspect", "--format", "{{.Config.Cmd}}", "foobar.com/test1-image:latest"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
Expect(session.OutputToString()).To(ContainSubstring("sh -c a b c"))
|
||||
|
||||
session = podmanTest.Podman([]string{"commit", "--change", "CMD=[\"a\",\"b\",\"c\"]", "test1", "foobar.com/test1-image:latest"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
|
||||
session = podmanTest.Podman([]string{"inspect", "--format", "{{.Config.Cmd}}", "foobar.com/test1-image:latest"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
Expect(session.OutputToString()).To(Not(ContainSubstring("sh -c")))
|
||||
})
|
||||
|
||||
It("podman commit container with pause flag", func() {
|
||||
_, ec, _ := podmanTest.RunLsContainer("test1")
|
||||
Expect(ec).To(Equal(0))
|
||||
|
Reference in New Issue
Block a user