Skip to content

Commit c403ee5

Browse files
Produce distroless minimized container images
This change produces a minimal container image (~25MB) containing only the entrypoint bash (static) executable, the split-sync or split-proxy executable, and the minimal Debian files needed for these to execute. The dependency on the `tr` application was removed from functions.sh by using bash variable parameter expansion instead. We use a static bash executable to minimize libraries needed to include in the image. Bash executes only briefly in the entrypoint which then exec's into the application. split-sync and split-proxy are dynamically linked with libc because the go net library requires it. Therefore, libc is copied into the final image too. ca-certificates are copied into the image so TLS connections to split.io can be validated. The last build stage is used to produce a single-layer final container.
1 parent e20e7ae commit c403ee5

File tree

4 files changed

+65
-33
lines changed

4 files changed

+65
-33
lines changed

docker/Dockerfile.proxy

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,8 @@ ARG EXTRA_BUILD_ARGS
55
ARG FIPS_MODE
66

77
RUN apt update -y
8-
RUN apt install -y build-essential ca-certificates python3 git
8+
RUN apt install -y build-essential ca-certificates python3 git bash-static
99

10-
WORKDIR /code
11-
12-
COPY . .
13-
14-
RUN bash -c 'if [[ "${FIPS_MODE}" = "enabled" ]]; \
15-
then echo "building in fips mode"; make clean split-proxy-fips entrypoints EXTRA_BUILD_ARGS="${EXTRA_BUILD_ARGS}"; mv split-proxy-fips split-proxy; \
16-
else echo "building in standard mode"; make clean split-proxy entrypoints EXTRA_BUILD_ARGS="${EXTRA_BUILD_ARGS}"; \
17-
fi'
18-
19-
# Runner stage
20-
FROM debian:12.9 AS runner
21-
22-
RUN apt update -y
23-
RUN apt install -y bash ca-certificates
2410
RUN addgroup --gid 1000 --system 'split-proxy'
2511
RUN adduser \
2612
--disabled-password \
@@ -31,10 +17,39 @@ RUN adduser \
3117
--uid 1000 \
3218
'split-proxy'
3319

20+
WORKDIR /code
21+
22+
COPY . .
23+
24+
RUN bash -c 'if [[ "${FIPS_MODE}" = "enabled" ]]; \
25+
then echo "building in fips mode"; make clean split-proxy-fips entrypoints EXTRA_BUILD_ARGS="${EXTRA_BUILD_ARGS}"; mv split-proxy-fips split-proxy; \
26+
else echo "building in standard mode"; make clean split-proxy entrypoints EXTRA_BUILD_ARGS="${EXTRA_BUILD_ARGS}"; \
27+
fi'
28+
29+
# copy1 stage
30+
FROM scratch AS copy1
31+
3432
COPY docker/functions.sh .
3533

3634
COPY --from=builder /code/split-proxy /usr/bin/
3735
COPY --from=builder /code/entrypoint.proxy.sh .
36+
COPY --from=builder /bin/bash-static /bin/bash
37+
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
38+
COPY --from=builder /etc/passwd /etc/passwd
39+
COPY --from=builder /etc/shadow /etc/shadow
40+
COPY --from=builder /etc/group /etc/group
41+
# because split-sync is dynamically linked to glibc for the net library
42+
COPY --from=builder /lib/x86_64-linux-gnu/libc.so.6 /lib/x86_64-linux-gnu/libc.so.6
43+
COPY --from=builder /lib64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2
44+
# Get copyright statements for included components for legal compliance
45+
COPY --from=build /usr/share/doc/ca-certificates/copyright /usr/share/doc/ca-certificates/copyright
46+
COPY --from=build /usr/share/doc/bash-static/copyright /usr/share/doc/bash-static/copyright
47+
COPY --from=build /usr/share/doc/libc6/copyright /usr/share/doc/libc6/copyright
48+
49+
# runner stage squashed minimum layer
50+
FROM scratch
51+
52+
COPY --from=copy1 / /
3853

3954
EXPOSE 3000 3010
4055

docker/Dockerfile.synchronizer

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,8 @@ ARG EXTRA_BUILD_ARGS
55
ARG FIPS_MODE
66

77
RUN apt update -y
8-
RUN apt install -y build-essential ca-certificates python3 git
8+
RUN apt install -y build-essential ca-certificates python3 git bash-static
99

10-
WORKDIR /code
11-
12-
COPY . .
13-
14-
RUN bash -c 'if [[ "${FIPS_MODE}" = "enabled" ]]; \
15-
then echo "building in fips mode"; make clean split-sync-fips entrypoints EXTRA_BUILD_ARGS="${EXTRA_BUILD_ARGS}"; mv split-sync-fips split-sync; \
16-
else echo "building in standard mode"; make clean split-sync entrypoints EXTRA_BUILD_ARGS="${EXTRA_BUILD_ARGS}"; \
17-
fi'
18-
19-
# Runner stage
20-
FROM debian:12.9 AS runner
21-
22-
RUN apt update -y
23-
RUN apt install -y bash ca-certificates
2410
RUN addgroup --gid 1000 --system 'split-synchronizer'
2511
RUN adduser \
2612
--disabled-password \
@@ -31,10 +17,40 @@ RUN adduser \
3117
--uid 1000 \
3218
'split-synchronizer'
3319

20+
WORKDIR /code
21+
22+
COPY . .
23+
24+
RUN bash -c 'if [[ "${FIPS_MODE}" = "enabled" ]]; \
25+
then echo "building in fips mode"; make clean split-sync-fips entrypoints EXTRA_BUILD_ARGS="${EXTRA_BUILD_ARGS}"; mv split-sync-fips split-sync; \
26+
else echo "building in standard mode"; make clean split-sync entrypoints EXTRA_BUILD_ARGS="${EXTRA_BUILD_ARGS}"; \
27+
fi'
28+
29+
# copy1 stage
30+
FROM scratch AS copy1
31+
3432
COPY docker/functions.sh .
3533

3634
COPY --from=builder /code/split-sync /usr/bin/
3735
COPY --from=builder /code/entrypoint.synchronizer.sh .
36+
COPY --from=builder /bin/bash-static /bin/bash
37+
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
38+
COPY --from=builder /etc/passwd /etc/passwd
39+
COPY --from=builder /etc/shadow /etc/shadow
40+
COPY --from=builder /etc/group /etc/group
41+
# because split-sync is dynamically linked to glibc for the net library
42+
COPY --from=builder /lib/x86_64-linux-gnu/libc.so.6 /lib/x86_64-linux-gnu/libc.so.6
43+
COPY --from=builder /lib64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2
44+
# Get copyright statements for included components for legal compliance
45+
COPY --from=build /usr/share/doc/ca-certificates/copyright /usr/share/doc/ca-certificates/copyright
46+
COPY --from=build /usr/share/doc/bash-static/copyright /usr/share/doc/bash-static/copyright
47+
COPY --from=build /usr/share/doc/libc6/copyright /usr/share/doc/libc6/copyright
48+
49+
50+
# runner stage squashed minimum layer
51+
FROM scratch
52+
53+
COPY --from=copy1 / /
3854

3955
EXPOSE 3000 3010
4056

docker/entrypoint.sh.tpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#!/usr/bin/env bash
1+
#!/bin/bash
22

33
FLAGS=({{ARGS}})
44

docker/functions.sh

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#!/usr/bin/env bash
1+
#!/bin/bash
22

33
function parse_flags_from_conf_file() {
44
fn=$1
@@ -21,7 +21,8 @@ function flag_to_env_var() {
2121
return 1
2222
fi
2323

24-
echo "${prefix}_${flag}" | tr "[a-z]" "[A-Z]" | tr "-" "_"
24+
uppercase="${prefix^^}_${flag^^}"
25+
echo "${uppercase//-/_}"
2526
return 0
2627
}
2728

0 commit comments

Comments
 (0)