Skip to content

Commit 2f528db

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 2f528db

File tree

3 files changed

+97
-0
lines changed

3 files changed

+97
-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: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,23 @@
44
package main
55

66
import (
7+
"archive/tar"
78
"context"
9+
"errors"
810
"flag"
911
"fmt"
12+
"io"
13+
"io/fs"
1014
"os"
1115
"os/signal"
16+
"path"
1217
"path/filepath"
18+
"slices"
19+
"strings"
1320
"syscall"
1421

22+
"golang.org/x/sys/unix"
23+
1524
"github.com/openshift/source-to-image/pkg/cmd/cli"
1625
"k8s.io/klog/v2"
1726

@@ -46,6 +55,8 @@ func main() {
4655
cmd = s2iCmd
4756
case "socat":
4857
cmd = socat
58+
case "sh":
59+
cmd = sh
4960
}
5061

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

pkg/k8s/testdata/content.tar

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)