Skip to content

Commit 314cce0

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 314cce0

File tree

3 files changed

+79
-0
lines changed

3 files changed

+79
-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: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,17 @@
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"
1216
"path/filepath"
17+
"slices"
1318
"syscall"
1419

1520
"github.com/openshift/source-to-image/pkg/cmd/cli"
@@ -46,6 +51,8 @@ func main() {
4651
cmd = s2iCmd
4752
case "socat":
4853
cmd = socat
54+
case "sh":
55+
cmd = sh
4956
}
5057

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

pkg/k8s/testdata/content.tar

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)