From 8cad6d00823412cce773bda32f5d55b717b3d2ac Mon Sep 17 00:00:00 2001 From: balopat Date: Thu, 26 Jul 2018 11:16:26 -0700 Subject: [PATCH 1/2] reproduced 247 with integration test --- .gitignore | 1 + integration/dockerfiles/Dockerfile_test_daemons | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 integration/dockerfiles/Dockerfile_test_daemons diff --git a/.gitignore b/.gitignore index 89f9ac04aa..c58a5b6d00 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ out/ +.idea diff --git a/integration/dockerfiles/Dockerfile_test_daemons b/integration/dockerfiles/Dockerfile_test_daemons new file mode 100644 index 0000000000..134ce92cac --- /dev/null +++ b/integration/dockerfiles/Dockerfile_test_daemons @@ -0,0 +1,3 @@ +FROM busybox +RUN while true; do dd if=/dev/zero of=file`date +%s`.txt count=16000 bs=256 > /dev/null 2>&1; done & +RUN echo "wait a second..." && sleep 2 && ls -lrat file*.txt || echo "test passed." From 6fe9ea42484eccbb2fc86e5ae74f87a18477df19 Mon Sep 17 00:00:00 2001 From: balopat Date: Thu, 26 Jul 2018 12:57:04 -0700 Subject: [PATCH 2/2] fixes #247 killing grandchildren processes --- pkg/commands/run.go | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/pkg/commands/run.go b/pkg/commands/run.go index 2d85480dd1..0367e67230 100644 --- a/pkg/commands/run.go +++ b/pkg/commands/run.go @@ -27,6 +27,7 @@ import ( "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/docker/docker/builder/dockerfile/instructions" "github.com/google/go-containerregistry/pkg/v1" + "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -88,10 +89,29 @@ func (r *RunCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.Bui } gid = uint32(gid64) } - cmd.SysProcAttr = &syscall.SysProcAttr{} + cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} cmd.SysProcAttr.Credential = &syscall.Credential{Uid: uid, Gid: gid} } - return cmd.Run() + + if err := cmd.Start(); err != nil { + return errors.Wrap(err, "starting command") + } + + pgid, err := syscall.Getpgid(cmd.Process.Pid) + if err != nil { + return errors.Wrap(err, "getting group id for process") + } + + if err := cmd.Wait(); err != nil { + return errors.Wrap(err, "waiting for process to exit") + } + + //it's not an error if there are no grandchildren + if err := syscall.Kill(-pgid, syscall.SIGKILL); err != nil && err.Error() != "no such process" { + return err + } + + return nil } // FilesToSnapshot returns nil for this command because we don't know which files