Skip to content

Commit 50f8af2

Browse files
committed
Fix ./hack/verify-docker-deps.sh script to run on build platform
1 parent a28f8d3 commit 50f8af2

File tree

4 files changed

+46
-33
lines changed

4 files changed

+46
-33
lines changed

Dockerfile

+6-18
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
FROM --platform=$BUILDPLATFORM golang:1.23.0 as builder
15+
FROM --platform=$BUILDPLATFORM golang:1.23.0 AS builder
1616

1717
ARG STAGINGVERSION
1818
ARG TARGETPLATFORM
@@ -23,24 +23,24 @@ RUN GOARCH=$(echo $TARGETPLATFORM | cut -f2 -d '/') GCE_PD_CSI_STAGING_VERSION=$
2323

2424
# Start from Kubernetes Debian base.
2525

26-
FROM gke.gcr.io/debian-base:bookworm-v1.0.4-gke.2 as debian
26+
FROM gke.gcr.io/debian-base:bookworm-v1.0.4-gke.2 AS debian
2727

2828
# Install necessary dependencies
2929
# google_nvme_id script depends on the following packages: nvme-cli, xxd, bash
3030
RUN clean-install util-linux e2fsprogs mount ca-certificates udev xfsprogs nvme-cli xxd bash
3131

3232
# Since we're leveraging apt to pull in dependencies, we use `gcr.io/distroless/base` because it includes glibc.
33-
FROM gcr.io/distroless/base-debian12 as distroless-base
33+
FROM gcr.io/distroless/base-debian12 AS distroless-base
3434

3535
# The distroless amd64 image has a target triplet of x86_64
3636
FROM distroless-base AS distroless-amd64
37-
ENV LIB_DIR_PREFIX x86_64
37+
ENV LIB_DIR_PREFIX=x86_64
3838

3939
# The distroless arm64 image has a target triplet of aarch64
4040
FROM distroless-base AS distroless-arm64
41-
ENV LIB_DIR_PREFIX aarch64
41+
ENV LIB_DIR_PREFIX=aarch64
4242

43-
FROM distroless-$TARGETARCH as output-image
43+
FROM distroless-$TARGETARCH
4444

4545
# Copy necessary dependencies into distroless base.
4646
COPY --from=builder /go/src/sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/bin/gce-pd-csi-driver /gce-pd-csi-driver
@@ -119,16 +119,4 @@ COPY --from=debian /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libblkid.so.1 \
119119
# Copy NVME support required script and rules into distroless base.
120120
COPY deploy/kubernetes/udev/google_nvme_id /lib/udev_containerized/google_nvme_id
121121

122-
# Build stage used for validation of the output-image
123-
# See validate-container-linux-* targets in Makefile
124-
FROM output-image as validation-image
125-
126-
COPY --from=debian /usr/bin/ldd /usr/bin/find /usr/bin/xargs /usr/bin/
127-
COPY --from=builder /go/src/sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/hack/print-missing-deps.sh /print-missing-deps.sh
128-
SHELL ["/bin/bash", "-c"]
129-
RUN /print-missing-deps.sh
130-
131-
# Final build stage, create the real Docker image with ENTRYPOINT
132-
FROM output-image
133-
134122
ENTRYPOINT ["/gce-pd-csi-driver"]

Makefile

+16-12
Original file line numberDiff line numberDiff line change
@@ -73,20 +73,24 @@ build-and-push-multi-arch-debug: build-and-push-container-linux-debug build-and-
7373
push-container: build-container
7474

7575
# Used by hack/verify-docker-deps.sh, not used for building artifacts
76-
validate-container-linux-amd64: init-buildx
77-
$(DOCKER) buildx build --platform=linux/amd64 \
78-
-t validation_linux_amd64 \
79-
--target validation-image \
80-
--build-arg BUILDPLATFORM=linux \
81-
--build-arg STAGINGVERSION=$(STAGINGVERSION) .
76+
validate-container-linux-amd64: build-and-load-container-linux-amd64
77+
./hack/print-missing-deps.sh $(STAGINGIMAGE):$(STAGINGVERSION)_linux_amd64
8278

8379
# Used by hack/verify-docker-deps.sh, not used for building artifacts
84-
validate-container-linux-arm64: init-buildx
85-
$(DOCKER) buildx build --platform=linux/arm64 \
86-
-t validation_linux_arm64 \
87-
--target validation-image \
88-
--build-arg BUILDPLATFORM=linux \
89-
--build-arg STAGINGVERSION=$(STAGINGVERSION) .
80+
validate-container-linux-arm64: build-and-load-container-linux-arm64
81+
./hack/print-missing-deps.sh $(STAGINGIMAGE):$(STAGINGVERSION)_linux_arm64
82+
83+
validate-container-linux: validate-container-linux-amd64 validate-container-linux-arm64
84+
85+
build-and-load-container-linux-amd64: require-GCE_PD_CSI_STAGING_IMAGE init-buildx
86+
$(DOCKER) buildx build --platform=linux/amd64 \
87+
-t $(STAGINGIMAGE):$(STAGINGVERSION)_linux_amd64 \
88+
--build-arg STAGINGVERSION=$(STAGINGVERSION) --load .
89+
90+
build-and-load-container-linux-arm64: require-GCE_PD_CSI_STAGING_IMAGE init-buildx
91+
$(DOCKER) buildx build --file=Dockerfile --platform=linux/arm64 \
92+
-t $(STAGINGIMAGE):$(STAGINGVERSION)_linux_arm64 \
93+
--build-arg STAGINGVERSION=$(STAGINGVERSION) --load .
9094

9195
build-and-push-container-linux-amd64: require-GCE_PD_CSI_STAGING_IMAGE init-buildx
9296
$(DOCKER) buildx build --platform=linux/amd64 \

hack/print-missing-deps.sh

+22-2
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,33 @@ set -o pipefail
2020

2121
echo "Verifying Docker Executables have appropriate dependencies"
2222

23+
TEMP_DIR="$(mktemp -d)"
24+
trap 'rm -rf -- "$TEMP_DIR"' EXIT
25+
26+
export CONTAINER_IMAGE="$1"
27+
export CONTAINER_EXPORT_DIR="$TEMP_DIR/image_dir"
28+
29+
extractContainerImage() {
30+
CONTAINER_ID="$(docker create "$CONTAINER_IMAGE")"
31+
CONTAINER_EXPORT_TAR="$TEMP_DIR/image.tar"
32+
docker export "$CONTAINER_ID" -o "$CONTAINER_EXPORT_TAR"
33+
mkdir -p "$CONTAINER_EXPORT_DIR"
34+
tar xf "$CONTAINER_EXPORT_TAR" -C "$CONTAINER_EXPORT_DIR"
35+
}
36+
37+
printNeededDeps() {
38+
readelf -d "$@" 2>&1 | grep NEEDED | awk '{print $5}' | sed -e 's@\[@@g' -e 's@\]@@g'
39+
}
40+
2341
printMissingDep() {
24-
if /usr/bin/ldd "$@" | grep "not found"; then
42+
if ! find "$CONTAINER_EXPORT_DIR" -name "$@" > /dev/null; then
2543
echo "!!! Missing deps for $@ !!!"
2644
exit 1
2745
fi
2846
}
2947

48+
export -f printNeededDeps
3049
export -f printMissingDep
3150

32-
/usr/bin/find / -type f -executable -print | /usr/bin/xargs -I {} /bin/bash -c 'printMissingDep "{}"'
51+
extractContainerImage
52+
/usr/bin/find "$CONTAINER_EXPORT_DIR" -type f -executable -print | /usr/bin/xargs -I {} /bin/bash -c 'printNeededDeps "{}"' | sort | uniq | /usr/bin/xargs -I {} /bin/bash -c 'printMissingDep "{}"'

hack/verify-docker-deps.sh

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@ echo "Verifying Docker Image Dependencies"
2222

2323
PKG_ROOT=$(git rev-parse --show-toplevel)
2424

25-
make -C "${PKG_ROOT}" validate-container-linux-amd64 validate-container-linux-arm64
25+
export GCE_PD_CSI_STAGING_IMAGE=validation-image
26+
make -C "${PKG_ROOT}" validate-container-linux

0 commit comments

Comments
 (0)