mirror of
https://github.com/GoogleContainerTools/kaniko
synced 2026-10-21 12:04:11 +02:00
add a new run command along with a new flag
This commit is contained in:
@@ -51,3 +51,7 @@ func (b *BaseCommand) RequiresUnpackedFS() bool {
|
||||
func (b *BaseCommand) ShouldCacheOutput() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (a *BaseCommand) ShouldDetectDeletedFiles() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -52,11 +52,17 @@ type DockerCommand interface {
|
||||
RequiresUnpackedFS() bool
|
||||
|
||||
ShouldCacheOutput() bool
|
||||
|
||||
// ShouldDetectDeletedFiles turns true if the command could delete files.
|
||||
ShouldDetectDeletedFiles() bool
|
||||
}
|
||||
|
||||
func GetCommand(cmd instructions.Command, buildcontext string) (DockerCommand, error) {
|
||||
func GetCommand(cmd instructions.Command, buildcontext string, useNewRun bool) (DockerCommand, error) {
|
||||
switch c := cmd.(type) {
|
||||
case *instructions.RunCommand:
|
||||
if useNewRun {
|
||||
return &RunMarkerCommand{cmd: c}, nil
|
||||
}
|
||||
return &RunCommand{cmd: c}, nil
|
||||
case *instructions.CopyCommand:
|
||||
return &CopyCommand{cmd: c, buildcontext: buildcontext}, nil
|
||||
|
||||
+7
-4
@@ -46,8 +46,12 @@ var (
|
||||
)
|
||||
|
||||
func (r *RunCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {
|
||||
return runCommandInExec(config, buildArgs, r.cmd)
|
||||
}
|
||||
|
||||
func runCommandInExec(config *v1.Config, buildArgs *dockerfile.BuildArgs, cmdRun *instructions.RunCommand) error {
|
||||
var newCommand []string
|
||||
if r.cmd.PrependShell {
|
||||
if cmdRun.PrependShell {
|
||||
// This is the default shell on Linux
|
||||
var shell []string
|
||||
if len(config.Shell) > 0 {
|
||||
@@ -56,9 +60,9 @@ func (r *RunCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.Bui
|
||||
shell = append(shell, "/bin/sh", "-c")
|
||||
}
|
||||
|
||||
newCommand = append(shell, strings.Join(r.cmd.CmdLine, " "))
|
||||
newCommand = append(shell, strings.Join(cmdRun.CmdLine, " "))
|
||||
} else {
|
||||
newCommand = r.cmd.CmdLine
|
||||
newCommand = cmdRun.CmdLine
|
||||
}
|
||||
|
||||
logrus.Infof("cmd: %s", newCommand[0])
|
||||
@@ -111,7 +115,6 @@ func (r *RunCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.Bui
|
||||
if err := syscall.Kill(-pgid, syscall.SIGKILL); err != nil && err.Error() != "no such process" {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
Copyright 2018 Google LLC
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package commands
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/GoogleContainerTools/kaniko/pkg/dockerfile"
|
||||
"github.com/GoogleContainerTools/kaniko/pkg/util"
|
||||
v1 "github.com/google/go-containerregistry/pkg/v1"
|
||||
"github.com/moby/buildkit/frontend/dockerfile/instructions"
|
||||
)
|
||||
|
||||
type RunMarkerCommand struct {
|
||||
BaseCommand
|
||||
cmd *instructions.RunCommand
|
||||
Files []string
|
||||
}
|
||||
|
||||
func (r *RunMarkerCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {
|
||||
// run command `touch filemarker`
|
||||
markerFile, err := ioutil.TempFile("", "marker")
|
||||
defer func() {
|
||||
os.Remove(markerFile.Name())
|
||||
}()
|
||||
|
||||
if err := runCommandInExec(config, buildArgs, r.cmd); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// run command find to find all new files generated
|
||||
find := exec.Command("find", "/", "-newer", markerFile.Name())
|
||||
out, err := find.Output()
|
||||
if err != nil {
|
||||
r.Files = []string{}
|
||||
return nil
|
||||
}
|
||||
|
||||
r.Files = []string{}
|
||||
s := strings.Split(string(out), "\n")
|
||||
for _, path := range s {
|
||||
path = filepath.Clean(path)
|
||||
if util.IsDestDir(path) || util.CheckIgnoreList(path) {
|
||||
continue
|
||||
}
|
||||
r.Files = append(r.Files, path)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// String returns some information about the command for the image config
|
||||
func (r *RunMarkerCommand) String() string {
|
||||
return r.cmd.String()
|
||||
}
|
||||
|
||||
func (r *RunMarkerCommand) FilesToSnapshot() []string {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *RunMarkerCommand) ProvidesFilesToSnapshot() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
// CacheCommand returns true since this command should be cached
|
||||
func (r *RunMarkerCommand) CacheCommand(img v1.Image) DockerCommand {
|
||||
|
||||
return &CachingRunCommand{
|
||||
img: img,
|
||||
cmd: r.cmd,
|
||||
extractFn: util.ExtractFile,
|
||||
}
|
||||
}
|
||||
|
||||
func (r *RunMarkerCommand) MetadataOnly() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (r *RunMarkerCommand) RequiresUnpackedFS() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (r *RunMarkerCommand) ShouldCacheOutput() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (b *BaseCommand) ShouldDetectDelete() bool {
|
||||
return true
|
||||
}
|
||||
Reference in New Issue
Block a user