Skip to content

Commit

Permalink
improved check
Browse files Browse the repository at this point in the history
  • Loading branch information
calebdoxsey committed Jan 12, 2024
1 parent 24c1535 commit b747393
Showing 1 changed file with 85 additions and 17 deletions.
102 changes: 85 additions & 17 deletions scripts/check-docker-images
Original file line number Diff line number Diff line change
@@ -1,20 +1,88 @@
#!/usr/bin/bash
set -euo pipefail

_project_root="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)/.."
for _f in $(find "$_project_root" -name "*Dockerfile*"); do
echo "checking $_f"
for _img in $(sed -n -r -e 's/^FROM ([^:]*)(:[^@]*)(@sha256[^ ]*).*$/\1\2\3/p' "$_f"); do
echo "- $_img"
_media_type="$(
docker buildx imagetools inspect \
--format='{{print .Manifest.MediaType }}' \
"$_img"
)"

if [[ "$_media_type" != "application/vnd.oci.image.index.v1+json" && "$_media_type" != "application/vnd.docker.distribution.manifest.list.v2+json" ]]; then
echo "not a multi-platform manifest"
exit 1
fi
done
done
inspect-manifest() {
local _image
_image="${1?"image is required"}"

local _temp_dir
_temp_dir="${TMPDIR-/tmp}"
local _image_hash
_image_hash="$(echo -n "$_image" | shasum | cut -f1 -d' ')"
local _temp_file
_temp_file="${_temp_dir}/check-docker-image-${_image_hash}.json"

if [ ! -f "$_temp_file" ]; then
docker buildx imagetools inspect \
--format='{{json .}}' \
"$_image" >"$_temp_file"
fi

cat "$_temp_file"
}

check-image() {
local _image
_image="${1?"image is required"}"

echo "checking image=$_image"

local _manifest
_manifest="$(inspect-manifest "$_image")"

local _hasARM64
_has_arm64="$(echo "$_manifest" | jq '
.manifest.manifests
| map(select(.platform.architecture == "arm64" and .platform.os == "linux"))
| length >= 1
')"

if [[ "$_has_arm64" != "true" ]]; then
echo "- missing ARM64 in $_manifest"
exit 1
fi

local _hasAMD64
_has_amd64="$(echo "$_manifest" | jq '
.manifest.manifests
| map(select(.platform.architecture == "amd64" and .platform.os == "linux"))
| length >= 1
')"

if [[ "$_has_arm64" != "true" ]]; then
echo "- missing AMD64 in $_manifest"
exit 1
fi
}

check-dockerfile() {
local _file
_file="${1?"file is required"}"

echo "checking dockerfile=$_file"

while IFS= read -r _image; do
check-image "$_image"
done < <(sed -n -r -e 's/^FROM ([^:]*)(:[^@]*)(@sha256[^ ]*).*$/\1\2\3/p' "$_file")
}

check-directory() {
local _directory
_directory="${1?"directory is required"}"

echo "checking directory=$_directory"

local _file
while IFS= read -r -d '' _file; do
check-dockerfile "$_file"
done < <(find "$_directory" -name "*Dockerfile*" -print0)
}

main() {
local _project_root
_project_root="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)/.."

check-directory "$_project_root"
}

main

0 comments on commit b747393

Please sign in to comment.