Skip to content

Commit 74f1ab8

Browse files
committed
Removed dependency on sh/tar from alpine image
This commit removes depencency on sh and tar binaries by implementing the logic in our func-util binary. Signed-off-by: Matej Vašek <[email protected]>
1 parent 079db29 commit 74f1ab8

File tree

3 files changed

+92
-0
lines changed

3 files changed

+92
-0
lines changed

Dockerfile.utils

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ COPY --from=builder /workspace/func-util /usr/local/bin/
3434
RUN ln -s /usr/local/bin/func-util /usr/local/bin/deploy && \
3535
ln -s /usr/local/bin/func-util /usr/local/bin/scaffold && \
3636
ln -s /usr/local/bin/func-util /usr/local/bin/s2i && \
37+
ln -s /usr/local/bin/func-util /usr/local/bin/sh && \
3738
ln -s /usr/local/bin/func-util /usr/local/bin/socat
3839

3940
LABEL \

cmd/func-util/main.go

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,20 @@
44
package main
55

66
import (
7+
"archive/tar"
78
"context"
9+
"errors"
810
"flag"
911
"fmt"
12+
"golang.org/x/sys/unix"
13+
"io"
14+
"io/fs"
1015
"os"
1116
"os/signal"
17+
"path"
1218
"path/filepath"
19+
"slices"
20+
"strings"
1321
"syscall"
1422

1523
"github.com/openshift/source-to-image/pkg/cmd/cli"
@@ -46,6 +54,8 @@ func main() {
4654
cmd = s2iCmd
4755
case "socat":
4856
cmd = socat
57+
case "sh":
58+
cmd = sh
4959
}
5060

5161
err := cmd(ctx)
@@ -167,3 +177,84 @@ func (d deployDecorator) UpdateLabels(function fn.Function, labels map[string]st
167177
}
168178
return labels
169179
}
180+
181+
func sh(ctx context.Context) error {
182+
if !slices.Equal(os.Args[1:], []string{"-c", "umask 0000 && exec tar -xmf -"}) {
183+
return fmt.Errorf("this is a fake sh (only for backward compatiblility purposes)")
184+
}
185+
186+
var err error
187+
188+
wd, err := os.Getwd()
189+
if err != nil {
190+
return fmt.Errorf("cannot get working directory: %w", err)
191+
}
192+
193+
unix.Umask(0)
194+
195+
r := tar.NewReader(os.Stdin)
196+
197+
writeRegular := func(hdr *tar.Header) error {
198+
target := filepath.Join(wd, filepath.FromSlash(hdr.Name))
199+
e := os.MkdirAll(
200+
filepath.Dir(target),
201+
os.FileMode(hdr.Mode)&fs.ModePerm|0111,
202+
)
203+
if e != nil {
204+
return e
205+
}
206+
f, e := os.OpenFile(
207+
target,
208+
os.O_CREATE|os.O_TRUNC|os.O_WRONLY,
209+
os.FileMode(hdr.Mode)&fs.ModePerm,
210+
)
211+
defer func(f *os.File) {
212+
_ = f.Close()
213+
}(f)
214+
_, e = io.Copy(f, r)
215+
if e != nil {
216+
return e
217+
}
218+
return nil
219+
}
220+
221+
var first bool = true
222+
for {
223+
var h *tar.Header
224+
h, err = r.Next()
225+
if err != nil {
226+
if errors.Is(err, io.EOF) {
227+
if first {
228+
return fmt.Errorf("does not look like a tar")
229+
}
230+
return nil
231+
}
232+
return err
233+
}
234+
235+
if strings.HasPrefix(path.Clean(h.Name), "..") {
236+
return fmt.Errorf("file name escapes")
237+
}
238+
if strings.HasPrefix(path.Clean(h.Linkname), "..") {
239+
return fmt.Errorf("link target escapes")
240+
}
241+
242+
first = false
243+
switch {
244+
case h.Typeflag == tar.TypeReg || h.Typeflag == tar.TypeRegA:
245+
err = writeRegular(h)
246+
case h.Typeflag == tar.TypeDir:
247+
err = os.MkdirAll(
248+
filepath.Join(wd, filepath.FromSlash(h.Name)),
249+
os.FileMode(h.Mode)&fs.ModePerm,
250+
)
251+
case h.Typeflag == tar.TypeSymlink:
252+
err = os.Symlink(h.Linkname, filepath.Join(wd, filepath.FromSlash(h.Name)))
253+
default:
254+
_, _ = fmt.Printf("unsupported type flag: %d\n", h.Typeflag)
255+
}
256+
if err != nil {
257+
return err
258+
}
259+
}
260+
}

pkg/k8s/testdata/content.tar

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)