From 61351a71500c83e321e34ea682bd3bdf980ef4c9 Mon Sep 17 00:00:00 2001 From: j1nx Date: Sat, 21 Oct 2023 10:33:28 +0000 Subject: [PATCH] [WIP] Initial work on pre-pulling containers at buildtime. --- buildroot-external/Config.in | 1 + buildroot-external/configs/rpi4_64_defconfig | 3 +- .../package/ovos-containers/Config.in | 21 ++++++++++++ .../ovos-containers/fetch-container-image.sh | 33 +++++++++++++++++++ .../ovos-containers/ovos-containers.mk | 24 ++++++++++++++ 5 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 buildroot-external/package/ovos-containers/Config.in create mode 100755 buildroot-external/package/ovos-containers/fetch-container-image.sh create mode 100644 buildroot-external/package/ovos-containers/ovos-containers.mk diff --git a/buildroot-external/Config.in b/buildroot-external/Config.in index 99a9935c..817fb505 100644 --- a/buildroot-external/Config.in +++ b/buildroot-external/Config.in @@ -102,6 +102,7 @@ endmenu source "$BR2_EXTERNAL_OPENVOICEOS_PATH/package/openfec/Config.in" source "$BR2_EXTERNAL_OPENVOICEOS_PATH/package/openfst/Config.in" source "$BR2_EXTERNAL_OPENVOICEOS_PATH/package/ovos-bus-server/Config.in" + source "$BR2_EXTERNAL_OPENVOICEOS_PATH/package/ovos-containers/Config.in" source "$BR2_EXTERNAL_OPENVOICEOS_PATH/package/ovos-dashboard/Config.in" source "$BR2_EXTERNAL_OPENVOICEOS_PATH/package/ovos-shell/Config.in" source "$BR2_EXTERNAL_OPENVOICEOS_PATH/package/ovos-splash/Config.in" diff --git a/buildroot-external/configs/rpi4_64_defconfig b/buildroot-external/configs/rpi4_64_defconfig index 99d68f24..d3e9a9f0 100644 --- a/buildroot-external/configs/rpi4_64_defconfig +++ b/buildroot-external/configs/rpi4_64_defconfig @@ -141,9 +141,9 @@ BR2_PACKAGE_PYTHON_PODMAN_COMPOSE=y BR2_PACKAGE_LILV=y BR2_PACKAGE_OPUS=y BR2_PACKAGE_PORTAUDIO=y -BR2_PACKAGE_SPEEXDSP=y BR2_PACKAGE_SBC=y BR2_PACKAGE_SBC_TOOLS=y +BR2_PACKAGE_SPEEXDSP=y BR2_PACKAGE_WEBRTC_AUDIO_PROCESSING=y BR2_PACKAGE_LIBARCHIVE=y BR2_PACKAGE_LIBDEFLATE=y @@ -172,7 +172,6 @@ BR2_PACKAGE_LIBV4L_UTILS=y BR2_PACKAGE_JSON_GLIB=y BR2_PACKAGE_LIBCAMERA=y BR2_PACKAGE_LIBCAMERA_V4L2=y -BR2_PACKAGE_LIBCAMERA_PIPELINE_IPU3=y BR2_PACKAGE_LIBCAMERA_PIPELINE_SIMPLE=y BR2_PACKAGE_LIBCAMERA_PIPELINE_UVCVIDEO=y BR2_PACKAGE_LIBCAMERA_PIPELINE_VIMC=y diff --git a/buildroot-external/package/ovos-containers/Config.in b/buildroot-external/package/ovos-containers/Config.in new file mode 100644 index 00000000..dd214ee2 --- /dev/null +++ b/buildroot-external/package/ovos-containers/Config.in @@ -0,0 +1,21 @@ +menuconfig BR2_PACKAGE_OVOS_CONTAINERS + bool "Pre-install OVOS containers" + help + This is the system layer that prepares and + pre-install the required OVOS containers. + + https://github.com/OpenVoiceOS/ovos-docker + +if BR2_PACKAGE_OVOS_CONTAINERS + +config BR2_PACKAGE_OVOS_CONTAINERS_ARCH + string "Container Arch" + help + Architecture for which we should be pull. + +config BR2_PACKAGE_OVOS_CONTAINERS_IMAGES + string "Images" + help + Space separated list of images to pull. + +endif diff --git a/buildroot-external/package/ovos-containers/fetch-container-image.sh b/buildroot-external/package/ovos-containers/fetch-container-image.sh new file mode 100755 index 00000000..23f3e9c8 --- /dev/null +++ b/buildroot-external/package/ovos-containers/fetch-container-image.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +# Original script from Home Assistant + +set -e +set -u +set -o pipefail + +arch=$1 +image=$2 +dl_dir=$3 +dst_dir=$4 + +image_name="docker.io/smartgic/${image}" +full_image_name="${image_name}:alpha" +image_digest=$(skopeo inspect --retry-times=5 "docker://${full_image_name}" | jq -r '.Digest') + +image_file_name="${full_image_name//[:\/]/_}@${image_digest//[:\/]/_}" +image_file_path="${dl_dir}/${image_file_name}.tar" +dst_image_file_path="${dst_dir}/${image_file_name}.tar" + +( + # Use file locking to avoid race condition + flock --verbose 3 + if [ ! -f "${image_file_path}" ] + then + echo "Fetching image: ${full_image_name} (digest ${image_digest})" + skopeo copy "docker://${image_name}@${image_digest}" "docker-archive:${image_file_path}:${full_image_name}" + else + echo "Skipping download of existing image: ${full_image_name} (digest ${image_digest})" + fi + + cp "${image_file_path}" "${dst_image_file_path}" +) 3>"${image_file_path}.lock" diff --git a/buildroot-external/package/ovos-containers/ovos-containers.mk b/buildroot-external/package/ovos-containers/ovos-containers.mk new file mode 100644 index 00000000..f394ed12 --- /dev/null +++ b/buildroot-external/package/ovos-containers/ovos-containers.mk @@ -0,0 +1,24 @@ +################################################################################ +# +# OVOS Container images +# +################################################################################ + +OVOS_CONTAINERS_VERSION = 1.0.0 +OVOS_CONTAINERS_LICENSE = Apache License 2.0 +OVOS_CONTAINERS_LICENSE_FILES = $(BR2_EXTERNAL_OPENVOICEOS_PATH)/../LICENSE +OVOS_CONTAINERS_SITE = $(BR2_EXTERNAL_OPENVOICEOS_PATH)/package/ovos-containers +OVOS_CONTAINERS_SITE_METHOD = local + +OVOS_CONTAINERS_IMAGES = $(call qstrip,$(BR2_PACKAGE_OVOS_CONTAINERS)) + +define OVOS_CONTAINERS_BUILD_CMDS + $(Q)mkdir -p $(@D)/images + $(Q)mkdir -p $(OVOS_CONTAINERS_DL_DIR) + $(foreach image,$(OVOS_CONTAINERS_IMAGES),\ + $(BR2_EXTERNAL_OPENVOICEOS_PATH)/package/ovos-containers/fetch-container-image.sh \ + $(BR2_PACKAGE_OVOS_CONTAINERS_ARCH) $(image) "$(OVOS_CONTAINERS_DL_DIR)" "$(@D)/images" + ) +endef + +$(eval $(generic-package))