Skip to content

Commit

Permalink
Merge pull request #7409 from zhangguanzhang/apiv2-create-ctr-with-in…
Browse files Browse the repository at this point in the history
…valid-entrypoint

fix apiv2 will create containers with incorrect commands
  • Loading branch information
openshift-merge-robot authored Aug 26, 2020
2 parents 3a9d524 + fa6ba68 commit f99954c
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 11 deletions.
7 changes: 4 additions & 3 deletions libpod/container_internal.go
Original file line number Diff line number Diff line change
Expand Up @@ -483,12 +483,13 @@ func (c *Container) setupStorage(ctx context.Context) error {

// Set the default Entrypoint and Command
if containerInfo.Config != nil {
// Set CMD in the container to the default configuration only if ENTRYPOINT is not set by the user.
if c.config.Entrypoint == nil && c.config.Command == nil {
c.config.Command = containerInfo.Config.Config.Cmd
}
if c.config.Entrypoint == nil {
c.config.Entrypoint = containerInfo.Config.Config.Entrypoint
}
if c.config.Command == nil {
c.config.Command = containerInfo.Config.Config.Cmd
}
}

artifacts := filepath.Join(c.config.StaticDir, artifactsDir)
Expand Down
10 changes: 9 additions & 1 deletion pkg/api/handlers/compat/containers.go
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,14 @@ func LibpodToContainerJSON(l *libpod.Container, sz bool) (*types.ContainerJSON,
SizeRootFs: &inspect.SizeRootFs,
}

// set Path and Args
processArgs := l.Config().Spec.Process.Args
if len(processArgs) > 0 {
cb.Path = processArgs[0]
}
if len(processArgs) > 1 {
cb.Args = processArgs[1:]
}
stopTimeout := int(l.StopTimeout())

exposedPorts := make(nat.PortSet)
Expand Down Expand Up @@ -346,7 +354,7 @@ func LibpodToContainerJSON(l *libpod.Container, sz bool) (*types.ContainerJSON,
OpenStdin: inspect.Config.OpenStdin,
StdinOnce: inspect.Config.StdinOnce,
Env: inspect.Config.Env,
Cmd: inspect.Config.Cmd,
Cmd: l.Command(),
Healthcheck: nil,
ArgsEscaped: false,
Image: imageName,
Expand Down
13 changes: 7 additions & 6 deletions pkg/api/handlers/compat/containers_create.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,20 +87,21 @@ func makeCreateConfig(ctx context.Context, containerConfig *config.Config, input
workDir = input.WorkingDir
}

if input.Entrypoint == nil {
entrypointSlice, err := newImage.Entrypoint(ctx)
// Only use image's Cmd when the user does not set the entrypoint
if input.Entrypoint == nil && len(input.Cmd) == 0 {
cmdSlice, err := newImage.Cmd(ctx)
if err != nil {
return createconfig.CreateConfig{}, err
}
input.Entrypoint = entrypointSlice
input.Cmd = cmdSlice
}

if len(input.Cmd) == 0 {
cmdSlice, err := newImage.Cmd(ctx)
if input.Entrypoint == nil {
entrypointSlice, err := newImage.Entrypoint(ctx)
if err != nil {
return createconfig.CreateConfig{}, err
}
input.Cmd = cmdSlice
input.Entrypoint = entrypointSlice
}

stopTimeout := containerConfig.Engine.StopTimeout
Expand Down
11 changes: 10 additions & 1 deletion pkg/spec/spec.go
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,16 @@ func (config *CreateConfig) createConfigToOCISpec(runtime *libpod.Runtime, userM
g.AddMount(cgroupMnt)
}
g.SetProcessCwd(config.WorkDir)
g.SetProcessArgs(config.Command)

ProcessArgs := make([]string, 0)
if len(config.Entrypoint) > 0 {
ProcessArgs = config.Entrypoint
}
if len(config.Command) > 0 {
ProcessArgs = append(ProcessArgs, config.Command...)
}
g.SetProcessArgs(ProcessArgs)

g.SetProcessTerminal(config.Tty)

for key, val := range config.Annotations {
Expand Down
27 changes: 27 additions & 0 deletions test/apiv2/20-containers.at
Original file line number Diff line number Diff line change
Expand Up @@ -151,4 +151,31 @@ t DELETE images/localhost/newrepo:v2?force=true 200
t DELETE libpod/containers/$cid 204
t DELETE libpod/containers/myctr 204


# test apiv2 create container with correct entrypoint and cmd
# --data '{"Image":"quay.io/libpod/alpine_labels:latest","Entrypoint":["echo"],"Cmd":["param1","param2"]}'
t POST containers/create '"Image":"'$IMAGE'","Entrypoint":["echo"],"Cmd":["param1","param2"]' 201 \
.Id~[0-9a-f]\\{64\\}
cid=$(jq -r '.Id' <<<"$output")
t GET containers/$cid/json 200 \
.Config.Entrypoint[0]="echo" \
.Config.Cmd[0]="param1" \
.Config.Cmd[1]="param2" \
.Path="echo" \
.Args[0]="param1" \
.Args[1]="param2"
t DELETE containers/$cid 204

# test only set the entrpoint, Cmd should be []
t POST containers/create '"Image":"'$IMAGE'","Entrypoint":["echo","param1"]' 201 \
.Id~[0-9a-f]\\{64\\}
cid=$(jq -r '.Id' <<<"$output")
t GET containers/$cid/json 200 \
.Config.Entrypoint[0]="echo" \
.Config.Entrypoint[1]="param1" \
.Config.Cmd='[]' \
.Path="echo" \
.Args[0]="param1"
t DELETE containers/$cid 204

# vim: filetype=sh

0 comments on commit f99954c

Please sign in to comment.