[v8,4/6] containers/templates: Templates for Dockerfiles

Message ID 20230717210815.29737-5-ahassick@iol.unh.edu (mailing list archive)
State New
Headers
Series Community Lab Containers and Builder Engine |

Commit Message

Adam Hassick July 17, 2023, 9:08 p.m. UTC
  From: Owen Hilyard <ohilyard@iol.unh.edu>

Adds a variety of extensible templates used to create the Dockerfiles
for each target. All templates inherit from base, and most distros and
distro families have their own templates that are used to define common
functionality. Multiple versions of a distro may use a single template
if they are similar enough (ex: fedora).

Signed-off-by: Owen Hilyard <ohilyard@iol.unh.edu>
Signed-off-by: Adam Hassick <ahassick@iol.unh.edu>
---
 .../templates/containers.makefile.j2          |  73 +++++++++++
 .../templates/containers/alpine.dockerfile.j2 |   3 +
 .../templates/containers/arch.dockerfile.j2   |  39 ++++++
 .../templates/containers/base.dockerfile.j2   | 120 ++++++++++++++++++
 .../containers/centos8.dockerfile.j2          |  21 +++
 .../containers/centos9.dockerfile.j2          |  17 +++
 .../templates/containers/debian.dockerfile.j2 |   7 +
 .../containers/debian10.dockerfile.j2         |   3 +
 .../containers/debian11.dockerfile.j2         |   3 +
 .../debian11_arm_ipsec.dockerfile.j2          |  16 +++
 .../containers/debian_bullseye.dockerfile.j2  |   3 +
 .../containers/debian_buster.dockerfile.j2    |   3 +
 .../templates/containers/fedora.dockerfile.j2 |  11 ++
 .../containers/fedora36_clang.dockerfile.j2   |   7 +
 .../containers/fedora_clang.dockerfile.j2     |   8 ++
 .../containers/fedora_coverity.dockerfile.j2  |  10 ++
 .../containers/opensuse.dockerfile.j2         |  10 ++
 .../containers/redhat_family.dockerfile.j2    |   5 +
 .../templates/containers/rhel.dockerfile.j2   |  16 +++
 .../templates/containers/rhel7.dockerfile.j2  |  15 +++
 .../templates/containers/rhel8.dockerfile.j2  |  15 +++
 .../templates/containers/rhel9.dockerfile.j2  |  19 +++
 .../templates/containers/rpm.dockerfile.j2    |   3 +
 .../templates/containers/ubuntu.dockerfile.j2 |   3 +
 .../containers/ubuntu20.04.dockerfile.j2      |  12 ++
 .../containers/ubuntu22.04.dockerfile.j2      |   3 +
 .../containers/ubuntu_cross.dockerfile.j2     |  11 ++
 .../containers/ubuntu_sve.dockerfile.j2       |  12 ++
 28 files changed, 468 insertions(+)
 create mode 100644 containers/template_engine/templates/containers.makefile.j2
 create mode 100644 containers/template_engine/templates/containers/alpine.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/arch.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/base.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/centos8.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/centos9.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/debian.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/debian10.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/debian11.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/debian11_arm_ipsec.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/debian_bullseye.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/debian_buster.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/fedora.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/fedora36_clang.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/fedora_clang.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/fedora_coverity.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/opensuse.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/redhat_family.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/rhel.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/rhel7.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/rhel8.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/rhel9.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/rpm.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/ubuntu.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/ubuntu20.04.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/ubuntu22.04.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/ubuntu_cross.dockerfile.j2
 create mode 100644 containers/template_engine/templates/containers/ubuntu_sve.dockerfile.j2
  

Comments

Aaron Conole Aug. 4, 2023, 2:02 p.m. UTC | #1
Adam Hassick <ahassick@iol.unh.edu> writes:

> From: Owen Hilyard <ohilyard@iol.unh.edu>
>
> Adds a variety of extensible templates used to create the Dockerfiles
> for each target. All templates inherit from base, and most distros and
> distro families have their own templates that are used to define common
> functionality. Multiple versions of a distro may use a single template
> if they are similar enough (ex: fedora).
>
> Signed-off-by: Owen Hilyard <ohilyard@iol.unh.edu>
> Signed-off-by: Adam Hassick <ahassick@iol.unh.edu>
> ---
>  .../templates/containers.makefile.j2          |  73 +++++++++++
>  .../templates/containers/alpine.dockerfile.j2 |   3 +
>  .../templates/containers/arch.dockerfile.j2   |  39 ++++++
>  .../templates/containers/base.dockerfile.j2   | 120 ++++++++++++++++++
>  .../containers/centos8.dockerfile.j2          |  21 +++
>  .../containers/centos9.dockerfile.j2          |  17 +++
>  .../templates/containers/debian.dockerfile.j2 |   7 +
>  .../containers/debian10.dockerfile.j2         |   3 +
>  .../containers/debian11.dockerfile.j2         |   3 +
>  .../debian11_arm_ipsec.dockerfile.j2          |  16 +++
>  .../containers/debian_bullseye.dockerfile.j2  |   3 +
>  .../containers/debian_buster.dockerfile.j2    |   3 +
>  .../templates/containers/fedora.dockerfile.j2 |  11 ++
>  .../containers/fedora36_clang.dockerfile.j2   |   7 +
>  .../containers/fedora_clang.dockerfile.j2     |   8 ++
>  .../containers/fedora_coverity.dockerfile.j2  |  10 ++
>  .../containers/opensuse.dockerfile.j2         |  10 ++
>  .../containers/redhat_family.dockerfile.j2    |   5 +
>  .../templates/containers/rhel.dockerfile.j2   |  16 +++
>  .../templates/containers/rhel7.dockerfile.j2  |  15 +++
>  .../templates/containers/rhel8.dockerfile.j2  |  15 +++
>  .../templates/containers/rhel9.dockerfile.j2  |  19 +++
>  .../templates/containers/rpm.dockerfile.j2    |   3 +
>  .../templates/containers/ubuntu.dockerfile.j2 |   3 +
>  .../containers/ubuntu20.04.dockerfile.j2      |  12 ++
>  .../containers/ubuntu22.04.dockerfile.j2      |   3 +
>  .../containers/ubuntu_cross.dockerfile.j2     |  11 ++
>  .../containers/ubuntu_sve.dockerfile.j2       |  12 ++
>  28 files changed, 468 insertions(+)
>  create mode 100644 containers/template_engine/templates/containers.makefile.j2
>  create mode 100644 containers/template_engine/templates/containers/alpine.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/arch.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/base.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/centos8.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/centos9.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/debian.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/debian10.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/debian11.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/debian11_arm_ipsec.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/debian_bullseye.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/debian_buster.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/fedora.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/fedora36_clang.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/fedora_clang.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/fedora_coverity.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/opensuse.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/redhat_family.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/rhel.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/rhel7.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/rhel8.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/rhel9.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/rpm.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/ubuntu.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/ubuntu20.04.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/ubuntu22.04.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/ubuntu_cross.dockerfile.j2
>  create mode 100644 containers/template_engine/templates/containers/ubuntu_sve.dockerfile.j2
>
> diff --git a/containers/template_engine/templates/containers.makefile.j2 b/containers/template_engine/templates/containers.makefile.j2
> new file mode 100644
> index 0000000..900bfc8
> --- /dev/null
> +++ b/containers/template_engine/templates/containers.makefile.j2
> @@ -0,0 +1,73 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}

2023?  This is everywhere set to 2022, but I guess it should really be
2023, or 2022,2023

> +#################### START VARS #################
> +DPDK_CI_CONTAINER_BUILDER_PROGRAM?=podman
> +DPDK_CI_CONTAINERS_EXTRA_PUSH_ARGS?=
> +DPDK_CI_CONTAINERS_REGISTRY_HOSTNAME?={{ registry_hostname }}
> +
> +#################### END VARS #################
> +
> +.PHONY: build_all
> +build_all:{% for container in dockerfiles.targets %} build_{{ container.name }}{% endfor %}
> +
> +.PHONY: push_image_all
> +push_image_all:{% for container in dockerfiles.targets %} push_image_{{ container.name }}{% endfor %}
> +
> +.PHONY: push_manifest_all
> +push_manifest_all:
> +{%- if is_builder %}
> +	echo "Disabled: Builder mode was enabled."
> +{%- else -%}
> +	{% for container in dockerfiles.targets %} push_manifest_{{ container.name }}{% endfor %}
> +{%- endif %}
> +
> +{%- macro push_indx(container, is_docker) %}
> +	{%- for tag in container.tags -%}
> +	{%- set formatted_tag = tag | replace('$R', registry_hostname) | replace('$T', timestamp) | replace('$N', container.name) | replace(':', '\\:') -%}
> +	{%- set trunk_tag = formatted_tag.split('/')[1] -%}
> +	{%- if is_docker -%}
> +		{%- set ref_tag = formatted_tag -%}
> +		{%- set push_xargs = '' -%}
> +	{%- else -%}
> +		{%- set ref_tag = trunk_tag -%}
> +		{%- set push_xargs = ' docker\://%s' | format(formatted_tag) -%}
> +	{%- endif -%}
> +	$(DPDK_CI_CONTAINER_BUILDER_PROGRAM) manifest rm {{ ref_tag }} || echo "Image {{ ref_tag }} did not exist initially."
> +	$(DPDK_CI_CONTAINER_BUILDER_PROGRAM) manifest create {{ ref_tag }}
> +	{%- for platform in container.platforms -%}
> +	{%- set plat_tag = "%s/%s\:image-%s-%s" | format(registry_hostname, container.name, platform.replace('/', ''), timestamp) %} \
> +		{{ plat_tag -}} {% endfor %}
> +	$(DPDK_CI_CONTAINER_BUILDER_PROGRAM) manifest push $(DPDK_CI_CONTAINERS_EXTRA_PUSH_ARGS) {{ ref_tag }} {{- push_xargs }}
> +	{% endfor -%}
> +{% endmacro %}
> +
> +{% for container in dockerfiles.targets %}
> +#################### START {{ container.name }} #####################
> +  {% set container_id = container.name %}
> +.PHONY: build_{{ container_id }}
> +
> +build_{{ container_id }}:
> +	{%- for platform in container.platforms -%}
> +	{%- set plat_tag = "%s/%s\:image-%s-%s" | format(registry_hostname, container_id, platform.replace('/', ''), timestamp) %}
> +	$(DPDK_CI_CONTAINER_BUILDER_PROGRAM) build --target {{container.name}} --platform {{ platform }} \
> +		-t {{ plat_tag }} -f {{ container_id }}.dockerfile $(CURDIR) {%- endfor %}
> +
> +.PHONY: push_image_{{ container_id }}
> +push_image_{{ container_id }}: build_{{ container_id }}
> +	{%- for platform in container.platforms -%}
> +	{%- set plat_tag = "%s/%s\:image-%s-%s" | format(registry_hostname, container_id, platform.replace('/', ''), timestamp) %}
> +	$(DPDK_CI_CONTAINER_BUILDER_PROGRAM) push $(DPDK_CI_CONTAINERS_EXTRA_PUSH_ARGS) {{ plat_tag }}
> +	{%- endfor %}
> +{% if not is_builder %}
> +.PHONY: push_manifest_{{ container_id }}
> +push_manifest_{{ container_id }}:
> +{%- if host_arch_only and not is_builder %} push_image_{{ container_id }}{% endif %}
> +ifeq ($(DPDK_CI_CONTAINER_BUILDER_PROGRAM), docker)
> +	{{ push_indx(container, true) }}
> +else
> +	{{ push_indx(container, false) }}
> +endif
> +{% endif %}
> +
> +#################### END {{ container.name }} #####################
> +{% endfor %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/alpine.dockerfile.j2 b/containers/template_engine/templates/containers/alpine.dockerfile.j2
> new file mode 100644
> index 0000000..f386b42
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/alpine.dockerfile.j2
> @@ -0,0 +1,3 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/base.dockerfile.j2' %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/arch.dockerfile.j2 b/containers/template_engine/templates/containers/arch.dockerfile.j2
> new file mode 100644
> index 0000000..edfa6d4
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/arch.dockerfile.j2
> @@ -0,0 +1,39 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/base.dockerfile.j2' %}
> +
> +{% block pre_package_manager %}
> +RUN pacman-key --init
> +RUN pacman -Sy --noconfirm archlinux-keyring && pacman -Su --noconfirm
> +{% endblock %}
> +
> +
> +{% block pip_installs %}
> +RUN mkdir -p ~/.config/pip \
> +    && printf '[global]\nbreak-system-packages = true\n' >> ~/.config/pip/pip.conf \
> +    && python3 -m pip install ninja pyelftools
> +{% endblock %}
> +
> +{% block before_meson_after_pip %}
> +# add user for building aur packages
> +RUN useradd builder && \
> +    mkdir /home/builder && \
> +    chown builder:builder /home/builder
> +
> +# switch user to make packages from aur
> +USER builder
> +
> +# clone and make rdma-core packages
> +RUN cd /home/builder && git clone https://aur.archlinux.org/rdma-core.git
> +RUN cd /home/builder/rdma-core && makepkg
> +
> +USER root
> +
> +RUN cd /home/builder/rdma-core && pacman --noconfirm -U rdma-core-*.pkg.tar.*
> +
> +RUN rm -rf /home/builder
> +{% endblock %}
> +
> +{% block install_libabigail %}
> +{# Installed via package manager #}
> +{% endblock install_libabigail %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/base.dockerfile.j2 b/containers/template_engine/templates/containers/base.dockerfile.j2
> new file mode 100644
> index 0000000..92f5cb5
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/base.dockerfile.j2
> @@ -0,0 +1,120 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +# ------------------------ Begin {{ target.name }} ------------------------------------------------
> +
> +{%- set build_base_img = target.name + "_base" %}
> +FROM {{ target.base_image }} as {% if build_abi and not target.force_disable_abi -%}
> +{{ build_base_img }}
> +{%- else -%}
> +{{ target.name }}
> +{%- endif %}
> +
> +ENV CCACHE_DIR=/ccache/
> +ENV CCACHE_COMPILERCHECK=content
> +ENV CCACHE_NAMESPACE="{{ target.name }}-{{ build_timestamp }}"
> +ENV BUILD_TIMESTAMP="{{ build_timestamp }}"
> +
> +{% block extra_env_vars -%}{%- endblock extra_env_vars %}
> +
> +{% block pre_package_manager -%}{%- endblock pre_package_manager %}
> +
> +# Install packages
> +RUN {{ target.package_manager_command }} {{ target.packages | join(" ") }}
> +
> +# Installs from pip
> +{% block pip_installs -%}{%- endblock pip_installs %}
> +
> +# Extra setup after python libs are installed
> +{% block before_meson_after_pip -%}{%- endblock %}
> +
> +# install libabigail
> +{% block install_libabigail %}
> +{% if build_libabigail and build_abi and (not "force_disable_abi" in target or not target.force_disable_abi) %}
> +COPY libabigail /libabigail
> +RUN --mount=type=cache,target=/ccache,z cd /libabigail
> +{%- if "libabigail_revision" in target %} && git checkout {{ target.libabigail_revision }} {%- endif %} && mkdir build && autoreconf -i && cd build && ../configure --prefix=/usr/local && make all install && \
> +    ldconfig && cd / && rm -rf /libabigail
> +{% else %}
> +#   libabigail build is disabled
> +{% endif %}
> +{% endblock install_libabigail %}
> +
> +# cross compilation setup
> +{% block cross_compilation_setup %}
> +{% endblock cross_compilation_setup %}
> +
> +# Copy externally pulled DPDK into the container
> +RUN mkdir /dpdk
> +COPY dpdk-stable /dpdk-stable
> +
> +# Install meson
> +{% block install_meson %}
> +# Install meson from dpdk main
> +# Writes to the mount are discarded once the container is built and is not shared with other containers or the host
> +COPY dpdk /dpdk
> +RUN --mount=type=cache,target=/ccache,z cd /dpdk && chown -R root /dpdk && git checkout main && sh .ci/linux-setup.sh
> +RUN rm -rf /dpdk
> +{% endblock install_meson %}
> +
> +ENV RTE_KERNELDIR CHANGE_ME
> +
> +RUN mkdir /references
> +WORKDIR /references
> +RUN touch abi_versions
> +# build the abi
> +{% if build_abi and not target.force_disable_abi %}
> +    {% block build_abi %}
> +        {% for version in abi.versions %}
> +            {%- set abi_version_str = (version.abi_version.major|string) + "." + (version.abi_version.minor|string) -%}
> +            {%- set abi_stage_name = target.name + "_" + abi_version_str -%}
> +            {%- set abi_folder = "/references/" + abi_version_str + "_reference" %}
> +            {%- set meets_version_requirements = "minimum_dpdk_version" in target and version.dpdk_version.major >= target.minimum_dpdk_version.major and version.dpdk_version.minor >= target.minimum_dpdk_version.minor and version.dpdk_version.revision >= target.minimum_dpdk_version.revision -%}
> +            {% if meets_version_requirements %}
> +
> +FROM {{ build_base_img }} AS {{ abi_stage_name }}
> +RUN echo '{{ abi_version_str }}' >> abi_versions
> +RUN mkdir -p {{ abi_folder }}
> +# compile DPDK
> +RUN --mount=type=cache,target=/ccache,z \
> +    mkdir -p /dpdk-stable/build && rm -rf /dpdk-stable/build && cd /dpdk-stable && git clean -xfd && git fetch --tags && git checkout {{ version.dpdk_version.git_tag }} && cd /references && \
> +    meson /dpdk-stable /dpdk-stable/build {% if "cross_file" in target -%}
> +    --cross-file=/dpdk-stable/{{ target.cross_file }}
> +    {%- endif %} -Dexamples=all --buildtype=debugoptimized && DESTDIR={{ abi_folder }} ninja {% if ninja_workers -%}
> +    -j {{ ninja_workers }} {% endif -%} -C /dpdk-stable/build install && \
> +    {%- if (abi_version_str == '22.0' or abi_version_str == '23.10')  %}
> +    bash /dpdk-stable/devtools/gen-abi.sh {{ abi_folder }} && mv {{ abi_folder }}/usr/local/include {{ abi_folder }} && \
> +    rm -rf {{ abi_folder }}/usr
> +    {%- else %}
> +    find {{ abi_folder }}/usr/local -name '*.a' -delete && rm -rf {{ abi_folder }}/usr/local/bin && rm -rf {{ abi_folder }}/usr/local/share
> +    {%- endif %} && rm -rf /dpdk-stable/build
> +            {% endif %}
> +        {% endfor %}
> +
> +FROM {{ build_base_img }} AS {{ target.name }}
> +    {% for version in abi.versions %}
> +        {%- set abi_version_str = (version.abi_version.major|string) + "." + (version.abi_version.minor|string) -%}
> +        {%- set abi_stage_name = target.name + "_" + abi_version_str -%}
> +        {%- set abi_folder = "/references/" + abi_version_str + "_reference" %}
> +        {%- set meets_version_requirements = "minimum_dpdk_version" in target and version.dpdk_version.major >= target.minimum_dpdk_version.major and version.dpdk_version.minor >= target.minimum_dpdk_version.minor and version.dpdk_version.revision >= target.minimum_dpdk_version.revision -%}
> +        {% if meets_version_requirements %}
> +RUN mkdir -p {{ abi_folder }}
> +COPY --from={{ abi_stage_name }} {{ abi_folder }} {{ abi_folder }}
> +        {%- endif %}
> +    {%- endfor %}
> +    {% endblock build_abi %}
> +RUN chmod -R 777 .
> +{% else %}
> +{% endif %}
> +
> +# Embed extra target information into the container
> +{% if 'extra_information' in target %}
> +RUN echo '{{ target.extra_information | tojson }}' > /container_info.json
> +{% endif %}
> +
> +WORKDIR /
> +
> +{% block copy_extras -%}
> +COPY scripts scripts
> +{%- endblock copy_extras %}
> +
> +# ------------------------ End {{ target.name }} ------------------------------------------------
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/centos8.dockerfile.j2 b/containers/template_engine/templates/containers/centos8.dockerfile.j2
> new file mode 100644
> index 0000000..bda024a
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/centos8.dockerfile.j2
> @@ -0,0 +1,21 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/redhat_family.dockerfile.j2' %}
> +
> +{% block pre_package_manager %}
> +# For ninja-build, meson, libmnl-devel, nasm, and CUnit-devel
> +RUN dnf install -y dnf-command\(config-manager\) dnf-plugins-core
> +# Install EPEL repository for ccache
> +RUN dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
> +# Enable powertools repository for libpcap-devel
> +RUN dnf config-manager --set-enabled powertools
> +{% endblock %}
> +
> +{% block pip_installs %}
> +RUN python3 -m pip install --upgrade pip
> +RUN python3 -m pip install pyelftools ninja
> +{% endblock %}
> +
> +{% block install_libabigail %}
> +{# Install via package manager #}
> +{% endblock install_libabigail %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/centos9.dockerfile.j2 b/containers/template_engine/templates/containers/centos9.dockerfile.j2
> new file mode 100644
> index 0000000..8cacb99
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/centos9.dockerfile.j2
> @@ -0,0 +1,17 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/redhat_family.dockerfile.j2' %}
> +
> +{% block pre_package_manager %}
> +# For ninja-build, meson, libmnl-devel, nasm, and CUnit-devel
> +RUN dnf install -y dnf-command\(config-manager\) dnf-plugins-core
> +# Install EPEL repository for ccache
> +RUN dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
> +# Enable powertools repository for libpcap-devel
> +RUN dnf config-manager --set-enabled crb
> +{% endblock %}
> +
> +{% block pip_installs %}
> +RUN python3 -m pip install --upgrade pip
> +RUN python3 -m pip install pyelftools ninja
> +{% endblock %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/debian.dockerfile.j2 b/containers/template_engine/templates/containers/debian.dockerfile.j2
> new file mode 100644
> index 0000000..74b56b6
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/debian.dockerfile.j2
> @@ -0,0 +1,7 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/base.dockerfile.j2' %}
> +
> +{% block pre_package_manager %}
> +ENV DEBIAN_FRONTEND=noninteractive
> +{% endblock %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/debian10.dockerfile.j2 b/containers/template_engine/templates/containers/debian10.dockerfile.j2
> new file mode 100644
> index 0000000..c52f866
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/debian10.dockerfile.j2
> @@ -0,0 +1,3 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/debian.dockerfile.j2' %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/debian11.dockerfile.j2 b/containers/template_engine/templates/containers/debian11.dockerfile.j2
> new file mode 100644
> index 0000000..c52f866
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/debian11.dockerfile.j2
> @@ -0,0 +1,3 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/debian.dockerfile.j2' %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/debian11_arm_ipsec.dockerfile.j2 b/containers/template_engine/templates/containers/debian11_arm_ipsec.dockerfile.j2
> new file mode 100644
> index 0000000..32fad51
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/debian11_arm_ipsec.dockerfile.j2
> @@ -0,0 +1,16 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/debian11.dockerfile.j2' %}
> +
> +{% block before_meson_after_pip %}
> +WORKDIR /opt
> +
> +# I would use ADD on a git repo, but the support for this was added so recently it doesn't run on my machine.

What is the minimum supported version for that?

> +RUN git clone --depth 1 --branch SECLIB-IPSEC-2022.05.25 https://git.gitlab.arm.com/arm-reference-solutions/ipsec-mb.git
> +
> +WORKDIR /opt/ipsec-mb
> +RUN make -j $(nproc) && make install
> +
> +WORKDIR /
> +
> +{% endblock before_meson_after_pip %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/debian_bullseye.dockerfile.j2 b/containers/template_engine/templates/containers/debian_bullseye.dockerfile.j2
> new file mode 100644
> index 0000000..c52f866
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/debian_bullseye.dockerfile.j2
> @@ -0,0 +1,3 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/debian.dockerfile.j2' %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/debian_buster.dockerfile.j2 b/containers/template_engine/templates/containers/debian_buster.dockerfile.j2
> new file mode 100644
> index 0000000..c52f866
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/debian_buster.dockerfile.j2
> @@ -0,0 +1,3 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/debian.dockerfile.j2' %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/fedora.dockerfile.j2 b/containers/template_engine/templates/containers/fedora.dockerfile.j2
> new file mode 100644
> index 0000000..97e438e
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/fedora.dockerfile.j2
> @@ -0,0 +1,11 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/redhat_family.dockerfile.j2' %}
> +
> +{%- block pip_installs -%}
> +RUN python3 -m pip install ninja
> +{%- endblock -%}
> +
> +{% block install_libabigail %}
> +# installed by package manager
> +{% endblock install_libabigail %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/fedora36_clang.dockerfile.j2 b/containers/template_engine/templates/containers/fedora36_clang.dockerfile.j2
> new file mode 100644
> index 0000000..bc104ba
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/fedora36_clang.dockerfile.j2
> @@ -0,0 +1,7 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/fedora.dockerfile.j2' %}
> +
> +{% block extra_env_vars -%}
> +ENV CC=clang
> +{%- endblock extra_env_vars %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/fedora_clang.dockerfile.j2 b/containers/template_engine/templates/containers/fedora_clang.dockerfile.j2
> new file mode 100644
> index 0000000..18ea757
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/fedora_clang.dockerfile.j2
> @@ -0,0 +1,8 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/fedora.dockerfile.j2' %}
> +
> +{% block extra_env_vars -%}
> +#ENV CCACHE_CC=clang
> +ENV CC=clang
> +{%- endblock extra_env_vars %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/fedora_coverity.dockerfile.j2 b/containers/template_engine/templates/containers/fedora_coverity.dockerfile.j2
> new file mode 100644
> index 0000000..f17eb7a
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/fedora_coverity.dockerfile.j2
> @@ -0,0 +1,10 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2023 University of New Hampshire -#}
> +{% extends 'containers/fedora.dockerfile.j2' %}
> +
> +{% block copy_extras -%}
> +COPY scripts scripts
> +COPY coverity coverity
> +
> +ENTRYPOINT /scripts/coverity.sh
> +{%- endblock copy_extras %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/opensuse.dockerfile.j2 b/containers/template_engine/templates/containers/opensuse.dockerfile.j2
> new file mode 100644
> index 0000000..48d2502
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/opensuse.dockerfile.j2
> @@ -0,0 +1,10 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/rpm.dockerfile.j2' %}
> +
> +{% block pip_installs %}
> +{% endblock %}
> +
> +{% block install_libabigail %}
> +{# Install via package manager #}
> +{% endblock install_libabigail %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/redhat_family.dockerfile.j2 b/containers/template_engine/templates/containers/redhat_family.dockerfile.j2
> new file mode 100644
> index 0000000..9ae6577
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/redhat_family.dockerfile.j2
> @@ -0,0 +1,5 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/rpm.dockerfile.j2' %}
> +
> +{# All of the distros in the Redhat Linux Lineage, ex: RHEL, Fedora, CentOS #}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/rhel.dockerfile.j2 b/containers/template_engine/templates/containers/rhel.dockerfile.j2
> new file mode 100644
> index 0000000..b50b2e9
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/rhel.dockerfile.j2
> @@ -0,0 +1,16 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/redhat_family.dockerfile.j2' %}
> +
> +{% block pip_installs %}
> +RUN python3 -m pip install pyelftools
> +{% endblock %}
> +
> +
> +{% block before_meson_after_pip %}
> +RUN yum clean all
> +{% endblock %}
> +
> +{% block install_libabigail %}
> +{# Install via package manager #}
> +{% endblock install_libabigail %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/rhel7.dockerfile.j2 b/containers/template_engine/templates/containers/rhel7.dockerfile.j2
> new file mode 100644
> index 0000000..7045b99
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/rhel7.dockerfile.j2
> @@ -0,0 +1,15 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/rhel.dockerfile.j2' %}
> +
> +{% block pre_package_manager %}
> +# repolist is needed to refresh the RHEL repos from the host this is being built on
> +RUN yum repolist
> +# Yes this next step is gross, there is no better way to enable the repos in the UBI containers.
> +RUN sed -i '/\[rhel-7-server-extras-rpms\]/,/^ *\[/ s/enabled\ =\ 0/enabled\ =\ 1/' /etc/yum.repos.d/redhat.repo \
> +    && sed -i '/\[rhel-7-server-optional-rpms\]/,/^ *\[/ s/enabled\ =\ 0/enabled\ =\ 1/' /etc/yum.repos.d/redhat.repo
> +RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
> +RUN yum update -y
> +
> +RUN yum groupinstall -y 'Development Tools'
> +{% endblock %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/rhel8.dockerfile.j2 b/containers/template_engine/templates/containers/rhel8.dockerfile.j2
> new file mode 100644
> index 0000000..2824bfd
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/rhel8.dockerfile.j2
> @@ -0,0 +1,15 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/rhel.dockerfile.j2' %}
> +
> +{% block pre_package_manager %}
> +# repolist is needed to refresh the RHEL repos from the host this is being built on
> +RUN yum repolist
> +RUN yum update -y
> +RUN yum config-manager --set-enable codeready-builder-for-rhel-8-$(uname -i)-rpms
> +
> +# Required to install ccache
> +RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm && yum upgrade -y
> +
> +RUN yum groupinstall -y 'Development Tools'
> +{% endblock %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/rhel9.dockerfile.j2 b/containers/template_engine/templates/containers/rhel9.dockerfile.j2
> new file mode 100644
> index 0000000..695f573
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/rhel9.dockerfile.j2
> @@ -0,0 +1,19 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/rhel.dockerfile.j2' %}
> +
> +{% block pre_package_manager %}
> +# repolist is needed to refresh the RHEL repos from the host this is being built on
> +RUN yum repolist
> +RUN yum config-manager --set-enable codeready-builder-for-rhel-9-$(uname -i)-rpms
> +RUN yum update -y
> +
> +# Required to install ccache
> +RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm && yum upgrade -y
> +
> +RUN yum groupinstall -y 'Development Tools'
> +{% endblock %}
> +
> +{% block pip_installs %}
> +RUN python3 -m pip install pyelftools ninja
> +{% endblock %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/rpm.dockerfile.j2 b/containers/template_engine/templates/containers/rpm.dockerfile.j2
> new file mode 100644
> index 0000000..f386b42
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/rpm.dockerfile.j2
> @@ -0,0 +1,3 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/base.dockerfile.j2' %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/ubuntu.dockerfile.j2 b/containers/template_engine/templates/containers/ubuntu.dockerfile.j2
> new file mode 100644
> index 0000000..c52f866
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/ubuntu.dockerfile.j2
> @@ -0,0 +1,3 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/debian.dockerfile.j2' %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/ubuntu20.04.dockerfile.j2 b/containers/template_engine/templates/containers/ubuntu20.04.dockerfile.j2
> new file mode 100644
> index 0000000..59d2c28
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/ubuntu20.04.dockerfile.j2
> @@ -0,0 +1,12 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/ubuntu.dockerfile.j2' %}
> +
> +{% block pip_installs -%}
> +RUN python3 -m pip install --no-cache-dir requests
> +{%- endblock pip_installs %}
> +
> +{% block before_meson_after_pip -%}
> +ADD https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.6.2.2472-linux.zip /
> +ADD https://sonarcloud.io/static/cpp/build-wrapper-linux-x86.zip /
> +{%- endblock %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/ubuntu22.04.dockerfile.j2 b/containers/template_engine/templates/containers/ubuntu22.04.dockerfile.j2
> new file mode 100644
> index 0000000..ba22471
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/ubuntu22.04.dockerfile.j2
> @@ -0,0 +1,3 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/ubuntu.dockerfile.j2' %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/ubuntu_cross.dockerfile.j2 b/containers/template_engine/templates/containers/ubuntu_cross.dockerfile.j2
> new file mode 100644
> index 0000000..236efbc
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/ubuntu_cross.dockerfile.j2
> @@ -0,0 +1,11 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/ubuntu20.04.dockerfile.j2' %}
> +
> +{% block cross_compilation_setup %}
> +# Link ccache to different compilers
> +    # aarch64 -> ccache
> +RUN ln -s $(which ccache) /usr/local/bin/aarch64-linux-gnu-gcc && \
> +    # aarch32 -> ccache
> +    ln -s $(which ccache) /usr/local/bin/arm-linux-gnueabihf-gcc
> +{% endblock cross_compilation_setup %}
> \ No newline at end of file
> diff --git a/containers/template_engine/templates/containers/ubuntu_sve.dockerfile.j2 b/containers/template_engine/templates/containers/ubuntu_sve.dockerfile.j2
> new file mode 100644
> index 0000000..5e940bf
> --- /dev/null
> +++ b/containers/template_engine/templates/containers/ubuntu_sve.dockerfile.j2
> @@ -0,0 +1,12 @@
> +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> +{#- Copyright (c) 2022 University of New Hampshire -#}
> +{% extends 'containers/ubuntu20.04.dockerfile.j2' %}
> +{% block cross_compilation_setup %}
> +RUN ln -s $(which ccache) /usr/local/bin/gcc-10
> +{% endblock cross_compilation_setup %}
> +
> +{% block build_abi %}
> +# ABI is disabled for this container
> +
> +FROM {{ build_base_img }} AS {{ target.name }}
> +{% endblock build_abi %}
> \ No newline at end of file
  
Adam Hassick Aug. 4, 2023, 7:34 p.m. UTC | #2
Using a Git URL as a parameter for an ADD directive is only supported by
Docker. This comment is a remnant from when we were developing with Docker,
prior to switching over to Podman.
I will update the copyright dates.

On Fri, Aug 4, 2023 at 10:02 AM Aaron Conole <aconole@redhat.com> wrote:

> Adam Hassick <ahassick@iol.unh.edu> writes:
>
> > From: Owen Hilyard <ohilyard@iol.unh.edu>
> >
> > Adds a variety of extensible templates used to create the Dockerfiles
> > for each target. All templates inherit from base, and most distros and
> > distro families have their own templates that are used to define common
> > functionality. Multiple versions of a distro may use a single template
> > if they are similar enough (ex: fedora).
> >
> > Signed-off-by: Owen Hilyard <ohilyard@iol.unh.edu>
> > Signed-off-by: Adam Hassick <ahassick@iol.unh.edu>
> > ---
> >  .../templates/containers.makefile.j2          |  73 +++++++++++
> >  .../templates/containers/alpine.dockerfile.j2 |   3 +
> >  .../templates/containers/arch.dockerfile.j2   |  39 ++++++
> >  .../templates/containers/base.dockerfile.j2   | 120 ++++++++++++++++++
> >  .../containers/centos8.dockerfile.j2          |  21 +++
> >  .../containers/centos9.dockerfile.j2          |  17 +++
> >  .../templates/containers/debian.dockerfile.j2 |   7 +
> >  .../containers/debian10.dockerfile.j2         |   3 +
> >  .../containers/debian11.dockerfile.j2         |   3 +
> >  .../debian11_arm_ipsec.dockerfile.j2          |  16 +++
> >  .../containers/debian_bullseye.dockerfile.j2  |   3 +
> >  .../containers/debian_buster.dockerfile.j2    |   3 +
> >  .../templates/containers/fedora.dockerfile.j2 |  11 ++
> >  .../containers/fedora36_clang.dockerfile.j2   |   7 +
> >  .../containers/fedora_clang.dockerfile.j2     |   8 ++
> >  .../containers/fedora_coverity.dockerfile.j2  |  10 ++
> >  .../containers/opensuse.dockerfile.j2         |  10 ++
> >  .../containers/redhat_family.dockerfile.j2    |   5 +
> >  .../templates/containers/rhel.dockerfile.j2   |  16 +++
> >  .../templates/containers/rhel7.dockerfile.j2  |  15 +++
> >  .../templates/containers/rhel8.dockerfile.j2  |  15 +++
> >  .../templates/containers/rhel9.dockerfile.j2  |  19 +++
> >  .../templates/containers/rpm.dockerfile.j2    |   3 +
> >  .../templates/containers/ubuntu.dockerfile.j2 |   3 +
> >  .../containers/ubuntu20.04.dockerfile.j2      |  12 ++
> >  .../containers/ubuntu22.04.dockerfile.j2      |   3 +
> >  .../containers/ubuntu_cross.dockerfile.j2     |  11 ++
> >  .../containers/ubuntu_sve.dockerfile.j2       |  12 ++
> >  28 files changed, 468 insertions(+)
> >  create mode 100644
> containers/template_engine/templates/containers.makefile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/alpine.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/arch.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/base.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/centos8.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/centos9.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/debian.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/debian10.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/debian11.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/debian11_arm_ipsec.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/debian_bullseye.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/debian_buster.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/fedora.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/fedora36_clang.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/fedora_clang.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/fedora_coverity.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/opensuse.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/redhat_family.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/rhel.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/rhel7.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/rhel8.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/rhel9.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/rpm.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/ubuntu.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/ubuntu20.04.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/ubuntu22.04.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/ubuntu_cross.dockerfile.j2
> >  create mode 100644
> containers/template_engine/templates/containers/ubuntu_sve.dockerfile.j2
> >
> > diff --git a/containers/template_engine/templates/containers.makefile.j2
> b/containers/template_engine/templates/containers.makefile.j2
> > new file mode 100644
> > index 0000000..900bfc8
> > --- /dev/null
> > +++ b/containers/template_engine/templates/containers.makefile.j2
> > @@ -0,0 +1,73 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
>
> 2023?  This is everywhere set to 2022, but I guess it should really be
> 2023, or 2022,2023
>
> > +#################### START VARS #################
> > +DPDK_CI_CONTAINER_BUILDER_PROGRAM?=podman
> > +DPDK_CI_CONTAINERS_EXTRA_PUSH_ARGS?=
> > +DPDK_CI_CONTAINERS_REGISTRY_HOSTNAME?={{ registry_hostname }}
> > +
> > +#################### END VARS #################
> > +
> > +.PHONY: build_all
> > +build_all:{% for container in dockerfiles.targets %} build_{{
> container.name }}{% endfor %}
> > +
> > +.PHONY: push_image_all
> > +push_image_all:{% for container in dockerfiles.targets %} push_image_{{
> container.name }}{% endfor %}
> > +
> > +.PHONY: push_manifest_all
> > +push_manifest_all:
> > +{%- if is_builder %}
> > +     echo "Disabled: Builder mode was enabled."
> > +{%- else -%}
> > +     {% for container in dockerfiles.targets %} push_manifest_{{
> container.name }}{% endfor %}
> > +{%- endif %}
> > +
> > +{%- macro push_indx(container, is_docker) %}
> > +     {%- for tag in container.tags -%}
> > +     {%- set formatted_tag = tag | replace('$R', registry_hostname) |
> replace('$T', timestamp) | replace('$N', container.name) | replace(':',
> '\\:') -%}
> > +     {%- set trunk_tag = formatted_tag.split('/')[1] -%}
> > +     {%- if is_docker -%}
> > +             {%- set ref_tag = formatted_tag -%}
> > +             {%- set push_xargs = '' -%}
> > +     {%- else -%}
> > +             {%- set ref_tag = trunk_tag -%}
> > +             {%- set push_xargs = ' docker\://%s' |
> format(formatted_tag) -%}
> > +     {%- endif -%}
> > +     $(DPDK_CI_CONTAINER_BUILDER_PROGRAM) manifest rm {{ ref_tag }} ||
> echo "Image {{ ref_tag }} did not exist initially."
> > +     $(DPDK_CI_CONTAINER_BUILDER_PROGRAM) manifest create {{ ref_tag }}
> > +     {%- for platform in container.platforms -%}
> > +     {%- set plat_tag = "%s/%s\:image-%s-%s" |
> format(registry_hostname, container.name, platform.replace('/', ''),
> timestamp) %} \
> > +             {{ plat_tag -}} {% endfor %}
> > +     $(DPDK_CI_CONTAINER_BUILDER_PROGRAM) manifest push
> $(DPDK_CI_CONTAINERS_EXTRA_PUSH_ARGS) {{ ref_tag }} {{- push_xargs }}
> > +     {% endfor -%}
> > +{% endmacro %}
> > +
> > +{% for container in dockerfiles.targets %}
> > +#################### START {{ container.name }} #####################
> > +  {% set container_id = container.name %}
> > +.PHONY: build_{{ container_id }}
> > +
> > +build_{{ container_id }}:
> > +     {%- for platform in container.platforms -%}
> > +     {%- set plat_tag = "%s/%s\:image-%s-%s" |
> format(registry_hostname, container_id, platform.replace('/', ''),
> timestamp) %}
> > +     $(DPDK_CI_CONTAINER_BUILDER_PROGRAM) build --target {{
> container.name}} --platform {{ platform }} \
> > +             -t {{ plat_tag }} -f {{ container_id }}.dockerfile
> $(CURDIR) {%- endfor %}
> > +
> > +.PHONY: push_image_{{ container_id }}
> > +push_image_{{ container_id }}: build_{{ container_id }}
> > +     {%- for platform in container.platforms -%}
> > +     {%- set plat_tag = "%s/%s\:image-%s-%s" |
> format(registry_hostname, container_id, platform.replace('/', ''),
> timestamp) %}
> > +     $(DPDK_CI_CONTAINER_BUILDER_PROGRAM) push
> $(DPDK_CI_CONTAINERS_EXTRA_PUSH_ARGS) {{ plat_tag }}
> > +     {%- endfor %}
> > +{% if not is_builder %}
> > +.PHONY: push_manifest_{{ container_id }}
> > +push_manifest_{{ container_id }}:
> > +{%- if host_arch_only and not is_builder %} push_image_{{ container_id
> }}{% endif %}
> > +ifeq ($(DPDK_CI_CONTAINER_BUILDER_PROGRAM), docker)
> > +     {{ push_indx(container, true) }}
> > +else
> > +     {{ push_indx(container, false) }}
> > +endif
> > +{% endif %}
> > +
> > +#################### END {{ container.name }} #####################
> > +{% endfor %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/alpine.dockerfile.j2
> b/containers/template_engine/templates/containers/alpine.dockerfile.j2
> > new file mode 100644
> > index 0000000..f386b42
> > --- /dev/null
> > +++
> b/containers/template_engine/templates/containers/alpine.dockerfile.j2
> > @@ -0,0 +1,3 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/base.dockerfile.j2' %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/arch.dockerfile.j2
> b/containers/template_engine/templates/containers/arch.dockerfile.j2
> > new file mode 100644
> > index 0000000..edfa6d4
> > --- /dev/null
> > +++ b/containers/template_engine/templates/containers/arch.dockerfile.j2
> > @@ -0,0 +1,39 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/base.dockerfile.j2' %}
> > +
> > +{% block pre_package_manager %}
> > +RUN pacman-key --init
> > +RUN pacman -Sy --noconfirm archlinux-keyring && pacman -Su --noconfirm
> > +{% endblock %}
> > +
> > +
> > +{% block pip_installs %}
> > +RUN mkdir -p ~/.config/pip \
> > +    && printf '[global]\nbreak-system-packages = true\n' >>
> ~/.config/pip/pip.conf \
> > +    && python3 -m pip install ninja pyelftools
> > +{% endblock %}
> > +
> > +{% block before_meson_after_pip %}
> > +# add user for building aur packages
> > +RUN useradd builder && \
> > +    mkdir /home/builder && \
> > +    chown builder:builder /home/builder
> > +
> > +# switch user to make packages from aur
> > +USER builder
> > +
> > +# clone and make rdma-core packages
> > +RUN cd /home/builder && git clone
> https://aur.archlinux.org/rdma-core.git
> > +RUN cd /home/builder/rdma-core && makepkg
> > +
> > +USER root
> > +
> > +RUN cd /home/builder/rdma-core && pacman --noconfirm -U
> rdma-core-*.pkg.tar.*
> > +
> > +RUN rm -rf /home/builder
> > +{% endblock %}
> > +
> > +{% block install_libabigail %}
> > +{# Installed via package manager #}
> > +{% endblock install_libabigail %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/base.dockerfile.j2
> b/containers/template_engine/templates/containers/base.dockerfile.j2
> > new file mode 100644
> > index 0000000..92f5cb5
> > --- /dev/null
> > +++ b/containers/template_engine/templates/containers/base.dockerfile.j2
> > @@ -0,0 +1,120 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +# ------------------------ Begin {{ target.name }}
> ------------------------------------------------
> > +
> > +{%- set build_base_img = target.name + "_base" %}
> > +FROM {{ target.base_image }} as {% if build_abi and not
> target.force_disable_abi -%}
> > +{{ build_base_img }}
> > +{%- else -%}
> > +{{ target.name }}
> > +{%- endif %}
> > +
> > +ENV CCACHE_DIR=/ccache/
> > +ENV CCACHE_COMPILERCHECK=content
> > +ENV CCACHE_NAMESPACE="{{ target.name }}-{{ build_timestamp }}"
> > +ENV BUILD_TIMESTAMP="{{ build_timestamp }}"
> > +
> > +{% block extra_env_vars -%}{%- endblock extra_env_vars %}
> > +
> > +{% block pre_package_manager -%}{%- endblock pre_package_manager %}
> > +
> > +# Install packages
> > +RUN {{ target.package_manager_command }} {{ target.packages | join(" ")
> }}
> > +
> > +# Installs from pip
> > +{% block pip_installs -%}{%- endblock pip_installs %}
> > +
> > +# Extra setup after python libs are installed
> > +{% block before_meson_after_pip -%}{%- endblock %}
> > +
> > +# install libabigail
> > +{% block install_libabigail %}
> > +{% if build_libabigail and build_abi and (not "force_disable_abi" in
> target or not target.force_disable_abi) %}
> > +COPY libabigail /libabigail
> > +RUN --mount=type=cache,target=/ccache,z cd /libabigail
> > +{%- if "libabigail_revision" in target %} && git checkout {{
> target.libabigail_revision }} {%- endif %} && mkdir build && autoreconf -i
> && cd build && ../configure --prefix=/usr/local && make all install && \
> > +    ldconfig && cd / && rm -rf /libabigail
> > +{% else %}
> > +#   libabigail build is disabled
> > +{% endif %}
> > +{% endblock install_libabigail %}
> > +
> > +# cross compilation setup
> > +{% block cross_compilation_setup %}
> > +{% endblock cross_compilation_setup %}
> > +
> > +# Copy externally pulled DPDK into the container
> > +RUN mkdir /dpdk
> > +COPY dpdk-stable /dpdk-stable
> > +
> > +# Install meson
> > +{% block install_meson %}
> > +# Install meson from dpdk main
> > +# Writes to the mount are discarded once the container is built and is
> not shared with other containers or the host
> > +COPY dpdk /dpdk
> > +RUN --mount=type=cache,target=/ccache,z cd /dpdk && chown -R root /dpdk
> && git checkout main && sh .ci/linux-setup.sh
> > +RUN rm -rf /dpdk
> > +{% endblock install_meson %}
> > +
> > +ENV RTE_KERNELDIR CHANGE_ME
> > +
> > +RUN mkdir /references
> > +WORKDIR /references
> > +RUN touch abi_versions
> > +# build the abi
> > +{% if build_abi and not target.force_disable_abi %}
> > +    {% block build_abi %}
> > +        {% for version in abi.versions %}
> > +            {%- set abi_version_str =
> (version.abi_version.major|string) + "." +
> (version.abi_version.minor|string) -%}
> > +            {%- set abi_stage_name = target.name + "_" +
> abi_version_str -%}
> > +            {%- set abi_folder = "/references/" + abi_version_str +
> "_reference" %}
> > +            {%- set meets_version_requirements = "minimum_dpdk_version"
> in target and version.dpdk_version.major >=
> target.minimum_dpdk_version.major and version.dpdk_version.minor >=
> target.minimum_dpdk_version.minor and version.dpdk_version.revision >=
> target.minimum_dpdk_version.revision -%}
> > +            {% if meets_version_requirements %}
> > +
> > +FROM {{ build_base_img }} AS {{ abi_stage_name }}
> > +RUN echo '{{ abi_version_str }}' >> abi_versions
> > +RUN mkdir -p {{ abi_folder }}
> > +# compile DPDK
> > +RUN --mount=type=cache,target=/ccache,z \
> > +    mkdir -p /dpdk-stable/build && rm -rf /dpdk-stable/build && cd
> /dpdk-stable && git clean -xfd && git fetch --tags && git checkout {{
> version.dpdk_version.git_tag }} && cd /references && \
> > +    meson /dpdk-stable /dpdk-stable/build {% if "cross_file" in target
> -%}
> > +    --cross-file=/dpdk-stable/{{ target.cross_file }}
> > +    {%- endif %} -Dexamples=all --buildtype=debugoptimized &&
> DESTDIR={{ abi_folder }} ninja {% if ninja_workers -%}
> > +    -j {{ ninja_workers }} {% endif -%} -C /dpdk-stable/build install
> && \
> > +    {%- if (abi_version_str == '22.0' or abi_version_str == '23.10')  %}
> > +    bash /dpdk-stable/devtools/gen-abi.sh {{ abi_folder }} && mv {{
> abi_folder }}/usr/local/include {{ abi_folder }} && \
> > +    rm -rf {{ abi_folder }}/usr
> > +    {%- else %}
> > +    find {{ abi_folder }}/usr/local -name '*.a' -delete && rm -rf {{
> abi_folder }}/usr/local/bin && rm -rf {{ abi_folder }}/usr/local/share
> > +    {%- endif %} && rm -rf /dpdk-stable/build
> > +            {% endif %}
> > +        {% endfor %}
> > +
> > +FROM {{ build_base_img }} AS {{ target.name }}
> > +    {% for version in abi.versions %}
> > +        {%- set abi_version_str = (version.abi_version.major|string) +
> "." + (version.abi_version.minor|string) -%}
> > +        {%- set abi_stage_name = target.name + "_" + abi_version_str
> -%}
> > +        {%- set abi_folder = "/references/" + abi_version_str +
> "_reference" %}
> > +        {%- set meets_version_requirements = "minimum_dpdk_version" in
> target and version.dpdk_version.major >= target.minimum_dpdk_version.major
> and version.dpdk_version.minor >= target.minimum_dpdk_version.minor and
> version.dpdk_version.revision >= target.minimum_dpdk_version.revision -%}
> > +        {% if meets_version_requirements %}
> > +RUN mkdir -p {{ abi_folder }}
> > +COPY --from={{ abi_stage_name }} {{ abi_folder }} {{ abi_folder }}
> > +        {%- endif %}
> > +    {%- endfor %}
> > +    {% endblock build_abi %}
> > +RUN chmod -R 777 .
> > +{% else %}
> > +{% endif %}
> > +
> > +# Embed extra target information into the container
> > +{% if 'extra_information' in target %}
> > +RUN echo '{{ target.extra_information | tojson }}' >
> /container_info.json
> > +{% endif %}
> > +
> > +WORKDIR /
> > +
> > +{% block copy_extras -%}
> > +COPY scripts scripts
> > +{%- endblock copy_extras %}
> > +
> > +# ------------------------ End {{ target.name }}
> ------------------------------------------------
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/centos8.dockerfile.j2
> b/containers/template_engine/templates/containers/centos8.dockerfile.j2
> > new file mode 100644
> > index 0000000..bda024a
> > --- /dev/null
> > +++
> b/containers/template_engine/templates/containers/centos8.dockerfile.j2
> > @@ -0,0 +1,21 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/redhat_family.dockerfile.j2' %}
> > +
> > +{% block pre_package_manager %}
> > +# For ninja-build, meson, libmnl-devel, nasm, and CUnit-devel
> > +RUN dnf install -y dnf-command\(config-manager\) dnf-plugins-core
> > +# Install EPEL repository for ccache
> > +RUN dnf install -y
> https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
> > +# Enable powertools repository for libpcap-devel
> > +RUN dnf config-manager --set-enabled powertools
> > +{% endblock %}
> > +
> > +{% block pip_installs %}
> > +RUN python3 -m pip install --upgrade pip
> > +RUN python3 -m pip install pyelftools ninja
> > +{% endblock %}
> > +
> > +{% block install_libabigail %}
> > +{# Install via package manager #}
> > +{% endblock install_libabigail %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/centos9.dockerfile.j2
> b/containers/template_engine/templates/containers/centos9.dockerfile.j2
> > new file mode 100644
> > index 0000000..8cacb99
> > --- /dev/null
> > +++
> b/containers/template_engine/templates/containers/centos9.dockerfile.j2
> > @@ -0,0 +1,17 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/redhat_family.dockerfile.j2' %}
> > +
> > +{% block pre_package_manager %}
> > +# For ninja-build, meson, libmnl-devel, nasm, and CUnit-devel
> > +RUN dnf install -y dnf-command\(config-manager\) dnf-plugins-core
> > +# Install EPEL repository for ccache
> > +RUN dnf install -y
> https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
> > +# Enable powertools repository for libpcap-devel
> > +RUN dnf config-manager --set-enabled crb
> > +{% endblock %}
> > +
> > +{% block pip_installs %}
> > +RUN python3 -m pip install --upgrade pip
> > +RUN python3 -m pip install pyelftools ninja
> > +{% endblock %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/debian.dockerfile.j2
> b/containers/template_engine/templates/containers/debian.dockerfile.j2
> > new file mode 100644
> > index 0000000..74b56b6
> > --- /dev/null
> > +++
> b/containers/template_engine/templates/containers/debian.dockerfile.j2
> > @@ -0,0 +1,7 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/base.dockerfile.j2' %}
> > +
> > +{% block pre_package_manager %}
> > +ENV DEBIAN_FRONTEND=noninteractive
> > +{% endblock %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/debian10.dockerfile.j2
> b/containers/template_engine/templates/containers/debian10.dockerfile.j2
> > new file mode 100644
> > index 0000000..c52f866
> > --- /dev/null
> > +++
> b/containers/template_engine/templates/containers/debian10.dockerfile.j2
> > @@ -0,0 +1,3 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/debian.dockerfile.j2' %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/debian11.dockerfile.j2
> b/containers/template_engine/templates/containers/debian11.dockerfile.j2
> > new file mode 100644
> > index 0000000..c52f866
> > --- /dev/null
> > +++
> b/containers/template_engine/templates/containers/debian11.dockerfile.j2
> > @@ -0,0 +1,3 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/debian.dockerfile.j2' %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/debian11_arm_ipsec.dockerfile.j2
> b/containers/template_engine/templates/containers/debian11_arm_ipsec.dockerfile.j2
> > new file mode 100644
> > index 0000000..32fad51
> > --- /dev/null
> > +++
> b/containers/template_engine/templates/containers/debian11_arm_ipsec.dockerfile.j2
> > @@ -0,0 +1,16 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/debian11.dockerfile.j2' %}
> > +
> > +{% block before_meson_after_pip %}
> > +WORKDIR /opt
> > +
> > +# I would use ADD on a git repo, but the support for this was added so
> recently it doesn't run on my machine.
>
> What is the minimum supported version for that?
>
> > +RUN git clone --depth 1 --branch SECLIB-IPSEC-2022.05.25
> https://git.gitlab.arm.com/arm-reference-solutions/ipsec-mb.git
> > +
> > +WORKDIR /opt/ipsec-mb
> > +RUN make -j $(nproc) && make install
> > +
> > +WORKDIR /
> > +
> > +{% endblock before_meson_after_pip %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/debian_bullseye.dockerfile.j2
> b/containers/template_engine/templates/containers/debian_bullseye.dockerfile.j2
> > new file mode 100644
> > index 0000000..c52f866
> > --- /dev/null
> > +++
> b/containers/template_engine/templates/containers/debian_bullseye.dockerfile.j2
> > @@ -0,0 +1,3 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/debian.dockerfile.j2' %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/debian_buster.dockerfile.j2
> b/containers/template_engine/templates/containers/debian_buster.dockerfile.j2
> > new file mode 100644
> > index 0000000..c52f866
> > --- /dev/null
> > +++
> b/containers/template_engine/templates/containers/debian_buster.dockerfile.j2
> > @@ -0,0 +1,3 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/debian.dockerfile.j2' %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/fedora.dockerfile.j2
> b/containers/template_engine/templates/containers/fedora.dockerfile.j2
> > new file mode 100644
> > index 0000000..97e438e
> > --- /dev/null
> > +++
> b/containers/template_engine/templates/containers/fedora.dockerfile.j2
> > @@ -0,0 +1,11 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/redhat_family.dockerfile.j2' %}
> > +
> > +{%- block pip_installs -%}
> > +RUN python3 -m pip install ninja
> > +{%- endblock -%}
> > +
> > +{% block install_libabigail %}
> > +# installed by package manager
> > +{% endblock install_libabigail %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/fedora36_clang.dockerfile.j2
> b/containers/template_engine/templates/containers/fedora36_clang.dockerfile.j2
> > new file mode 100644
> > index 0000000..bc104ba
> > --- /dev/null
> > +++
> b/containers/template_engine/templates/containers/fedora36_clang.dockerfile.j2
> > @@ -0,0 +1,7 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/fedora.dockerfile.j2' %}
> > +
> > +{% block extra_env_vars -%}
> > +ENV CC=clang
> > +{%- endblock extra_env_vars %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/fedora_clang.dockerfile.j2
> b/containers/template_engine/templates/containers/fedora_clang.dockerfile.j2
> > new file mode 100644
> > index 0000000..18ea757
> > --- /dev/null
> > +++
> b/containers/template_engine/templates/containers/fedora_clang.dockerfile.j2
> > @@ -0,0 +1,8 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/fedora.dockerfile.j2' %}
> > +
> > +{% block extra_env_vars -%}
> > +#ENV CCACHE_CC=clang
> > +ENV CC=clang
> > +{%- endblock extra_env_vars %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/fedora_coverity.dockerfile.j2
> b/containers/template_engine/templates/containers/fedora_coverity.dockerfile.j2
> > new file mode 100644
> > index 0000000..f17eb7a
> > --- /dev/null
> > +++
> b/containers/template_engine/templates/containers/fedora_coverity.dockerfile.j2
> > @@ -0,0 +1,10 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2023 University of New Hampshire -#}
> > +{% extends 'containers/fedora.dockerfile.j2' %}
> > +
> > +{% block copy_extras -%}
> > +COPY scripts scripts
> > +COPY coverity coverity
> > +
> > +ENTRYPOINT /scripts/coverity.sh
> > +{%- endblock copy_extras %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/opensuse.dockerfile.j2
> b/containers/template_engine/templates/containers/opensuse.dockerfile.j2
> > new file mode 100644
> > index 0000000..48d2502
> > --- /dev/null
> > +++
> b/containers/template_engine/templates/containers/opensuse.dockerfile.j2
> > @@ -0,0 +1,10 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/rpm.dockerfile.j2' %}
> > +
> > +{% block pip_installs %}
> > +{% endblock %}
> > +
> > +{% block install_libabigail %}
> > +{# Install via package manager #}
> > +{% endblock install_libabigail %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/redhat_family.dockerfile.j2
> b/containers/template_engine/templates/containers/redhat_family.dockerfile.j2
> > new file mode 100644
> > index 0000000..9ae6577
> > --- /dev/null
> > +++
> b/containers/template_engine/templates/containers/redhat_family.dockerfile.j2
> > @@ -0,0 +1,5 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/rpm.dockerfile.j2' %}
> > +
> > +{# All of the distros in the Redhat Linux Lineage, ex: RHEL, Fedora,
> CentOS #}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/rhel.dockerfile.j2
> b/containers/template_engine/templates/containers/rhel.dockerfile.j2
> > new file mode 100644
> > index 0000000..b50b2e9
> > --- /dev/null
> > +++ b/containers/template_engine/templates/containers/rhel.dockerfile.j2
> > @@ -0,0 +1,16 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/redhat_family.dockerfile.j2' %}
> > +
> > +{% block pip_installs %}
> > +RUN python3 -m pip install pyelftools
> > +{% endblock %}
> > +
> > +
> > +{% block before_meson_after_pip %}
> > +RUN yum clean all
> > +{% endblock %}
> > +
> > +{% block install_libabigail %}
> > +{# Install via package manager #}
> > +{% endblock install_libabigail %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/rhel7.dockerfile.j2
> b/containers/template_engine/templates/containers/rhel7.dockerfile.j2
> > new file mode 100644
> > index 0000000..7045b99
> > --- /dev/null
> > +++ b/containers/template_engine/templates/containers/rhel7.dockerfile.j2
> > @@ -0,0 +1,15 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/rhel.dockerfile.j2' %}
> > +
> > +{% block pre_package_manager %}
> > +# repolist is needed to refresh the RHEL repos from the host this is
> being built on
> > +RUN yum repolist
> > +# Yes this next step is gross, there is no better way to enable the
> repos in the UBI containers.
> > +RUN sed -i '/\[rhel-7-server-extras-rpms\]/,/^ *\[/ s/enabled\ =\
> 0/enabled\ =\ 1/' /etc/yum.repos.d/redhat.repo \
> > +    && sed -i '/\[rhel-7-server-optional-rpms\]/,/^ *\[/ s/enabled\ =\
> 0/enabled\ =\ 1/' /etc/yum.repos.d/redhat.repo
> > +RUN yum install -y
> https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
> > +RUN yum update -y
> > +
> > +RUN yum groupinstall -y 'Development Tools'
> > +{% endblock %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/rhel8.dockerfile.j2
> b/containers/template_engine/templates/containers/rhel8.dockerfile.j2
> > new file mode 100644
> > index 0000000..2824bfd
> > --- /dev/null
> > +++ b/containers/template_engine/templates/containers/rhel8.dockerfile.j2
> > @@ -0,0 +1,15 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/rhel.dockerfile.j2' %}
> > +
> > +{% block pre_package_manager %}
> > +# repolist is needed to refresh the RHEL repos from the host this is
> being built on
> > +RUN yum repolist
> > +RUN yum update -y
> > +RUN yum config-manager --set-enable
> codeready-builder-for-rhel-8-$(uname -i)-rpms
> > +
> > +# Required to install ccache
> > +RUN yum install -y
> https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm &&
> yum upgrade -y
> > +
> > +RUN yum groupinstall -y 'Development Tools'
> > +{% endblock %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/rhel9.dockerfile.j2
> b/containers/template_engine/templates/containers/rhel9.dockerfile.j2
> > new file mode 100644
> > index 0000000..695f573
> > --- /dev/null
> > +++ b/containers/template_engine/templates/containers/rhel9.dockerfile.j2
> > @@ -0,0 +1,19 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/rhel.dockerfile.j2' %}
> > +
> > +{% block pre_package_manager %}
> > +# repolist is needed to refresh the RHEL repos from the host this is
> being built on
> > +RUN yum repolist
> > +RUN yum config-manager --set-enable
> codeready-builder-for-rhel-9-$(uname -i)-rpms
> > +RUN yum update -y
> > +
> > +# Required to install ccache
> > +RUN yum install -y
> https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm &&
> yum upgrade -y
> > +
> > +RUN yum groupinstall -y 'Development Tools'
> > +{% endblock %}
> > +
> > +{% block pip_installs %}
> > +RUN python3 -m pip install pyelftools ninja
> > +{% endblock %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/rpm.dockerfile.j2
> b/containers/template_engine/templates/containers/rpm.dockerfile.j2
> > new file mode 100644
> > index 0000000..f386b42
> > --- /dev/null
> > +++ b/containers/template_engine/templates/containers/rpm.dockerfile.j2
> > @@ -0,0 +1,3 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/base.dockerfile.j2' %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/ubuntu.dockerfile.j2
> b/containers/template_engine/templates/containers/ubuntu.dockerfile.j2
> > new file mode 100644
> > index 0000000..c52f866
> > --- /dev/null
> > +++
> b/containers/template_engine/templates/containers/ubuntu.dockerfile.j2
> > @@ -0,0 +1,3 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/debian.dockerfile.j2' %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/ubuntu20.04.dockerfile.j2
> b/containers/template_engine/templates/containers/ubuntu20.04.dockerfile.j2
> > new file mode 100644
> > index 0000000..59d2c28
> > --- /dev/null
> > +++
> b/containers/template_engine/templates/containers/ubuntu20.04.dockerfile.j2
> > @@ -0,0 +1,12 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/ubuntu.dockerfile.j2' %}
> > +
> > +{% block pip_installs -%}
> > +RUN python3 -m pip install --no-cache-dir requests
> > +{%- endblock pip_installs %}
> > +
> > +{% block before_meson_after_pip -%}
> > +ADD
> https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.6.2.2472-linux.zip
> /
> > +ADD https://sonarcloud.io/static/cpp/build-wrapper-linux-x86.zip /
> > +{%- endblock %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/ubuntu22.04.dockerfile.j2
> b/containers/template_engine/templates/containers/ubuntu22.04.dockerfile.j2
> > new file mode 100644
> > index 0000000..ba22471
> > --- /dev/null
> > +++
> b/containers/template_engine/templates/containers/ubuntu22.04.dockerfile.j2
> > @@ -0,0 +1,3 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/ubuntu.dockerfile.j2' %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/ubuntu_cross.dockerfile.j2
> b/containers/template_engine/templates/containers/ubuntu_cross.dockerfile.j2
> > new file mode 100644
> > index 0000000..236efbc
> > --- /dev/null
> > +++
> b/containers/template_engine/templates/containers/ubuntu_cross.dockerfile.j2
> > @@ -0,0 +1,11 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/ubuntu20.04.dockerfile.j2' %}
> > +
> > +{% block cross_compilation_setup %}
> > +# Link ccache to different compilers
> > +    # aarch64 -> ccache
> > +RUN ln -s $(which ccache) /usr/local/bin/aarch64-linux-gnu-gcc && \
> > +    # aarch32 -> ccache
> > +    ln -s $(which ccache) /usr/local/bin/arm-linux-gnueabihf-gcc
> > +{% endblock cross_compilation_setup %}
> > \ No newline at end of file
> > diff --git
> a/containers/template_engine/templates/containers/ubuntu_sve.dockerfile.j2
> b/containers/template_engine/templates/containers/ubuntu_sve.dockerfile.j2
> > new file mode 100644
> > index 0000000..5e940bf
> > --- /dev/null
> > +++
> b/containers/template_engine/templates/containers/ubuntu_sve.dockerfile.j2
> > @@ -0,0 +1,12 @@
> > +{#- SPDX-License-Identifier: BSD-3-Clause -#}
> > +{#- Copyright (c) 2022 University of New Hampshire -#}
> > +{% extends 'containers/ubuntu20.04.dockerfile.j2' %}
> > +{% block cross_compilation_setup %}
> > +RUN ln -s $(which ccache) /usr/local/bin/gcc-10
> > +{% endblock cross_compilation_setup %}
> > +
> > +{% block build_abi %}
> > +# ABI is disabled for this container
> > +
> > +FROM {{ build_base_img }} AS {{ target.name }}
> > +{% endblock build_abi %}
> > \ No newline at end of file
>
>
  

Patch

diff --git a/containers/template_engine/templates/containers.makefile.j2 b/containers/template_engine/templates/containers.makefile.j2
new file mode 100644
index 0000000..900bfc8
--- /dev/null
+++ b/containers/template_engine/templates/containers.makefile.j2
@@ -0,0 +1,73 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+#################### START VARS #################
+DPDK_CI_CONTAINER_BUILDER_PROGRAM?=podman
+DPDK_CI_CONTAINERS_EXTRA_PUSH_ARGS?=
+DPDK_CI_CONTAINERS_REGISTRY_HOSTNAME?={{ registry_hostname }}
+
+#################### END VARS #################
+
+.PHONY: build_all
+build_all:{% for container in dockerfiles.targets %} build_{{ container.name }}{% endfor %}
+
+.PHONY: push_image_all
+push_image_all:{% for container in dockerfiles.targets %} push_image_{{ container.name }}{% endfor %}
+
+.PHONY: push_manifest_all
+push_manifest_all:
+{%- if is_builder %}
+	echo "Disabled: Builder mode was enabled."
+{%- else -%}
+	{% for container in dockerfiles.targets %} push_manifest_{{ container.name }}{% endfor %}
+{%- endif %}
+
+{%- macro push_indx(container, is_docker) %}
+	{%- for tag in container.tags -%}
+	{%- set formatted_tag = tag | replace('$R', registry_hostname) | replace('$T', timestamp) | replace('$N', container.name) | replace(':', '\\:') -%}
+	{%- set trunk_tag = formatted_tag.split('/')[1] -%}
+	{%- if is_docker -%}
+		{%- set ref_tag = formatted_tag -%}
+		{%- set push_xargs = '' -%}
+	{%- else -%}
+		{%- set ref_tag = trunk_tag -%}
+		{%- set push_xargs = ' docker\://%s' | format(formatted_tag) -%}
+	{%- endif -%}
+	$(DPDK_CI_CONTAINER_BUILDER_PROGRAM) manifest rm {{ ref_tag }} || echo "Image {{ ref_tag }} did not exist initially."
+	$(DPDK_CI_CONTAINER_BUILDER_PROGRAM) manifest create {{ ref_tag }}
+	{%- for platform in container.platforms -%}
+	{%- set plat_tag = "%s/%s\:image-%s-%s" | format(registry_hostname, container.name, platform.replace('/', ''), timestamp) %} \
+		{{ plat_tag -}} {% endfor %}
+	$(DPDK_CI_CONTAINER_BUILDER_PROGRAM) manifest push $(DPDK_CI_CONTAINERS_EXTRA_PUSH_ARGS) {{ ref_tag }} {{- push_xargs }}
+	{% endfor -%}
+{% endmacro %}
+
+{% for container in dockerfiles.targets %}
+#################### START {{ container.name }} #####################
+  {% set container_id = container.name %}
+.PHONY: build_{{ container_id }}
+
+build_{{ container_id }}:
+	{%- for platform in container.platforms -%}
+	{%- set plat_tag = "%s/%s\:image-%s-%s" | format(registry_hostname, container_id, platform.replace('/', ''), timestamp) %}
+	$(DPDK_CI_CONTAINER_BUILDER_PROGRAM) build --target {{container.name}} --platform {{ platform }} \
+		-t {{ plat_tag }} -f {{ container_id }}.dockerfile $(CURDIR) {%- endfor %}
+
+.PHONY: push_image_{{ container_id }}
+push_image_{{ container_id }}: build_{{ container_id }}
+	{%- for platform in container.platforms -%}
+	{%- set plat_tag = "%s/%s\:image-%s-%s" | format(registry_hostname, container_id, platform.replace('/', ''), timestamp) %}
+	$(DPDK_CI_CONTAINER_BUILDER_PROGRAM) push $(DPDK_CI_CONTAINERS_EXTRA_PUSH_ARGS) {{ plat_tag }}
+	{%- endfor %}
+{% if not is_builder %}
+.PHONY: push_manifest_{{ container_id }}
+push_manifest_{{ container_id }}:
+{%- if host_arch_only and not is_builder %} push_image_{{ container_id }}{% endif %}
+ifeq ($(DPDK_CI_CONTAINER_BUILDER_PROGRAM), docker)
+	{{ push_indx(container, true) }}
+else
+	{{ push_indx(container, false) }}
+endif
+{% endif %}
+
+#################### END {{ container.name }} #####################
+{% endfor %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/alpine.dockerfile.j2 b/containers/template_engine/templates/containers/alpine.dockerfile.j2
new file mode 100644
index 0000000..f386b42
--- /dev/null
+++ b/containers/template_engine/templates/containers/alpine.dockerfile.j2
@@ -0,0 +1,3 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/base.dockerfile.j2' %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/arch.dockerfile.j2 b/containers/template_engine/templates/containers/arch.dockerfile.j2
new file mode 100644
index 0000000..edfa6d4
--- /dev/null
+++ b/containers/template_engine/templates/containers/arch.dockerfile.j2
@@ -0,0 +1,39 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/base.dockerfile.j2' %}
+
+{% block pre_package_manager %}
+RUN pacman-key --init
+RUN pacman -Sy --noconfirm archlinux-keyring && pacman -Su --noconfirm
+{% endblock %}
+
+
+{% block pip_installs %}
+RUN mkdir -p ~/.config/pip \
+    && printf '[global]\nbreak-system-packages = true\n' >> ~/.config/pip/pip.conf \
+    && python3 -m pip install ninja pyelftools
+{% endblock %}
+
+{% block before_meson_after_pip %}
+# add user for building aur packages
+RUN useradd builder && \
+    mkdir /home/builder && \
+    chown builder:builder /home/builder
+
+# switch user to make packages from aur
+USER builder
+
+# clone and make rdma-core packages
+RUN cd /home/builder && git clone https://aur.archlinux.org/rdma-core.git
+RUN cd /home/builder/rdma-core && makepkg
+
+USER root
+
+RUN cd /home/builder/rdma-core && pacman --noconfirm -U rdma-core-*.pkg.tar.*
+
+RUN rm -rf /home/builder
+{% endblock %}
+
+{% block install_libabigail %}
+{# Installed via package manager #}
+{% endblock install_libabigail %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/base.dockerfile.j2 b/containers/template_engine/templates/containers/base.dockerfile.j2
new file mode 100644
index 0000000..92f5cb5
--- /dev/null
+++ b/containers/template_engine/templates/containers/base.dockerfile.j2
@@ -0,0 +1,120 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+# ------------------------ Begin {{ target.name }} ------------------------------------------------
+
+{%- set build_base_img = target.name + "_base" %}
+FROM {{ target.base_image }} as {% if build_abi and not target.force_disable_abi -%}
+{{ build_base_img }}
+{%- else -%}
+{{ target.name }}
+{%- endif %}
+
+ENV CCACHE_DIR=/ccache/
+ENV CCACHE_COMPILERCHECK=content
+ENV CCACHE_NAMESPACE="{{ target.name }}-{{ build_timestamp }}"
+ENV BUILD_TIMESTAMP="{{ build_timestamp }}"
+
+{% block extra_env_vars -%}{%- endblock extra_env_vars %}
+
+{% block pre_package_manager -%}{%- endblock pre_package_manager %}
+
+# Install packages
+RUN {{ target.package_manager_command }} {{ target.packages | join(" ") }}
+
+# Installs from pip
+{% block pip_installs -%}{%- endblock pip_installs %}
+
+# Extra setup after python libs are installed
+{% block before_meson_after_pip -%}{%- endblock %}
+
+# install libabigail
+{% block install_libabigail %}
+{% if build_libabigail and build_abi and (not "force_disable_abi" in target or not target.force_disable_abi) %}
+COPY libabigail /libabigail
+RUN --mount=type=cache,target=/ccache,z cd /libabigail
+{%- if "libabigail_revision" in target %} && git checkout {{ target.libabigail_revision }} {%- endif %} && mkdir build && autoreconf -i && cd build && ../configure --prefix=/usr/local && make all install && \
+    ldconfig && cd / && rm -rf /libabigail
+{% else %}
+#   libabigail build is disabled
+{% endif %}
+{% endblock install_libabigail %}
+
+# cross compilation setup
+{% block cross_compilation_setup %}
+{% endblock cross_compilation_setup %}
+
+# Copy externally pulled DPDK into the container
+RUN mkdir /dpdk
+COPY dpdk-stable /dpdk-stable
+
+# Install meson
+{% block install_meson %}
+# Install meson from dpdk main
+# Writes to the mount are discarded once the container is built and is not shared with other containers or the host
+COPY dpdk /dpdk
+RUN --mount=type=cache,target=/ccache,z cd /dpdk && chown -R root /dpdk && git checkout main && sh .ci/linux-setup.sh
+RUN rm -rf /dpdk
+{% endblock install_meson %}
+
+ENV RTE_KERNELDIR CHANGE_ME
+
+RUN mkdir /references
+WORKDIR /references
+RUN touch abi_versions
+# build the abi
+{% if build_abi and not target.force_disable_abi %}
+    {% block build_abi %}
+        {% for version in abi.versions %}
+            {%- set abi_version_str = (version.abi_version.major|string) + "." + (version.abi_version.minor|string) -%}
+            {%- set abi_stage_name = target.name + "_" + abi_version_str -%}
+            {%- set abi_folder = "/references/" + abi_version_str + "_reference" %}
+            {%- set meets_version_requirements = "minimum_dpdk_version" in target and version.dpdk_version.major >= target.minimum_dpdk_version.major and version.dpdk_version.minor >= target.minimum_dpdk_version.minor and version.dpdk_version.revision >= target.minimum_dpdk_version.revision -%}
+            {% if meets_version_requirements %}
+
+FROM {{ build_base_img }} AS {{ abi_stage_name }}
+RUN echo '{{ abi_version_str }}' >> abi_versions
+RUN mkdir -p {{ abi_folder }}
+# compile DPDK
+RUN --mount=type=cache,target=/ccache,z \
+    mkdir -p /dpdk-stable/build && rm -rf /dpdk-stable/build && cd /dpdk-stable && git clean -xfd && git fetch --tags && git checkout {{ version.dpdk_version.git_tag }} && cd /references && \
+    meson /dpdk-stable /dpdk-stable/build {% if "cross_file" in target -%}
+    --cross-file=/dpdk-stable/{{ target.cross_file }}
+    {%- endif %} -Dexamples=all --buildtype=debugoptimized && DESTDIR={{ abi_folder }} ninja {% if ninja_workers -%}
+    -j {{ ninja_workers }} {% endif -%} -C /dpdk-stable/build install && \
+    {%- if (abi_version_str == '22.0' or abi_version_str == '23.10')  %}
+    bash /dpdk-stable/devtools/gen-abi.sh {{ abi_folder }} && mv {{ abi_folder }}/usr/local/include {{ abi_folder }} && \
+    rm -rf {{ abi_folder }}/usr
+    {%- else %}
+    find {{ abi_folder }}/usr/local -name '*.a' -delete && rm -rf {{ abi_folder }}/usr/local/bin && rm -rf {{ abi_folder }}/usr/local/share
+    {%- endif %} && rm -rf /dpdk-stable/build
+            {% endif %}
+        {% endfor %}
+
+FROM {{ build_base_img }} AS {{ target.name }}
+    {% for version in abi.versions %}
+        {%- set abi_version_str = (version.abi_version.major|string) + "." + (version.abi_version.minor|string) -%}
+        {%- set abi_stage_name = target.name + "_" + abi_version_str -%}
+        {%- set abi_folder = "/references/" + abi_version_str + "_reference" %}
+        {%- set meets_version_requirements = "minimum_dpdk_version" in target and version.dpdk_version.major >= target.minimum_dpdk_version.major and version.dpdk_version.minor >= target.minimum_dpdk_version.minor and version.dpdk_version.revision >= target.minimum_dpdk_version.revision -%}
+        {% if meets_version_requirements %}
+RUN mkdir -p {{ abi_folder }}
+COPY --from={{ abi_stage_name }} {{ abi_folder }} {{ abi_folder }}
+        {%- endif %}
+    {%- endfor %}
+    {% endblock build_abi %}
+RUN chmod -R 777 .
+{% else %}
+{% endif %}
+
+# Embed extra target information into the container
+{% if 'extra_information' in target %}
+RUN echo '{{ target.extra_information | tojson }}' > /container_info.json
+{% endif %}
+
+WORKDIR /
+
+{% block copy_extras -%}
+COPY scripts scripts
+{%- endblock copy_extras %}
+
+# ------------------------ End {{ target.name }} ------------------------------------------------
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/centos8.dockerfile.j2 b/containers/template_engine/templates/containers/centos8.dockerfile.j2
new file mode 100644
index 0000000..bda024a
--- /dev/null
+++ b/containers/template_engine/templates/containers/centos8.dockerfile.j2
@@ -0,0 +1,21 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/redhat_family.dockerfile.j2' %}
+
+{% block pre_package_manager %}
+# For ninja-build, meson, libmnl-devel, nasm, and CUnit-devel
+RUN dnf install -y dnf-command\(config-manager\) dnf-plugins-core
+# Install EPEL repository for ccache
+RUN dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
+# Enable powertools repository for libpcap-devel
+RUN dnf config-manager --set-enabled powertools
+{% endblock %}
+
+{% block pip_installs %}
+RUN python3 -m pip install --upgrade pip
+RUN python3 -m pip install pyelftools ninja
+{% endblock %}
+
+{% block install_libabigail %}
+{# Install via package manager #}
+{% endblock install_libabigail %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/centos9.dockerfile.j2 b/containers/template_engine/templates/containers/centos9.dockerfile.j2
new file mode 100644
index 0000000..8cacb99
--- /dev/null
+++ b/containers/template_engine/templates/containers/centos9.dockerfile.j2
@@ -0,0 +1,17 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/redhat_family.dockerfile.j2' %}
+
+{% block pre_package_manager %}
+# For ninja-build, meson, libmnl-devel, nasm, and CUnit-devel
+RUN dnf install -y dnf-command\(config-manager\) dnf-plugins-core
+# Install EPEL repository for ccache
+RUN dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
+# Enable powertools repository for libpcap-devel
+RUN dnf config-manager --set-enabled crb
+{% endblock %}
+
+{% block pip_installs %}
+RUN python3 -m pip install --upgrade pip
+RUN python3 -m pip install pyelftools ninja
+{% endblock %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/debian.dockerfile.j2 b/containers/template_engine/templates/containers/debian.dockerfile.j2
new file mode 100644
index 0000000..74b56b6
--- /dev/null
+++ b/containers/template_engine/templates/containers/debian.dockerfile.j2
@@ -0,0 +1,7 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/base.dockerfile.j2' %}
+
+{% block pre_package_manager %}
+ENV DEBIAN_FRONTEND=noninteractive
+{% endblock %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/debian10.dockerfile.j2 b/containers/template_engine/templates/containers/debian10.dockerfile.j2
new file mode 100644
index 0000000..c52f866
--- /dev/null
+++ b/containers/template_engine/templates/containers/debian10.dockerfile.j2
@@ -0,0 +1,3 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/debian.dockerfile.j2' %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/debian11.dockerfile.j2 b/containers/template_engine/templates/containers/debian11.dockerfile.j2
new file mode 100644
index 0000000..c52f866
--- /dev/null
+++ b/containers/template_engine/templates/containers/debian11.dockerfile.j2
@@ -0,0 +1,3 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/debian.dockerfile.j2' %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/debian11_arm_ipsec.dockerfile.j2 b/containers/template_engine/templates/containers/debian11_arm_ipsec.dockerfile.j2
new file mode 100644
index 0000000..32fad51
--- /dev/null
+++ b/containers/template_engine/templates/containers/debian11_arm_ipsec.dockerfile.j2
@@ -0,0 +1,16 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/debian11.dockerfile.j2' %}
+
+{% block before_meson_after_pip %}
+WORKDIR /opt
+
+# I would use ADD on a git repo, but the support for this was added so recently it doesn't run on my machine.
+RUN git clone --depth 1 --branch SECLIB-IPSEC-2022.05.25 https://git.gitlab.arm.com/arm-reference-solutions/ipsec-mb.git
+
+WORKDIR /opt/ipsec-mb
+RUN make -j $(nproc) && make install
+
+WORKDIR /
+
+{% endblock before_meson_after_pip %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/debian_bullseye.dockerfile.j2 b/containers/template_engine/templates/containers/debian_bullseye.dockerfile.j2
new file mode 100644
index 0000000..c52f866
--- /dev/null
+++ b/containers/template_engine/templates/containers/debian_bullseye.dockerfile.j2
@@ -0,0 +1,3 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/debian.dockerfile.j2' %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/debian_buster.dockerfile.j2 b/containers/template_engine/templates/containers/debian_buster.dockerfile.j2
new file mode 100644
index 0000000..c52f866
--- /dev/null
+++ b/containers/template_engine/templates/containers/debian_buster.dockerfile.j2
@@ -0,0 +1,3 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/debian.dockerfile.j2' %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/fedora.dockerfile.j2 b/containers/template_engine/templates/containers/fedora.dockerfile.j2
new file mode 100644
index 0000000..97e438e
--- /dev/null
+++ b/containers/template_engine/templates/containers/fedora.dockerfile.j2
@@ -0,0 +1,11 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/redhat_family.dockerfile.j2' %}
+
+{%- block pip_installs -%}
+RUN python3 -m pip install ninja
+{%- endblock -%}
+
+{% block install_libabigail %}
+# installed by package manager
+{% endblock install_libabigail %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/fedora36_clang.dockerfile.j2 b/containers/template_engine/templates/containers/fedora36_clang.dockerfile.j2
new file mode 100644
index 0000000..bc104ba
--- /dev/null
+++ b/containers/template_engine/templates/containers/fedora36_clang.dockerfile.j2
@@ -0,0 +1,7 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/fedora.dockerfile.j2' %}
+
+{% block extra_env_vars -%}
+ENV CC=clang
+{%- endblock extra_env_vars %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/fedora_clang.dockerfile.j2 b/containers/template_engine/templates/containers/fedora_clang.dockerfile.j2
new file mode 100644
index 0000000..18ea757
--- /dev/null
+++ b/containers/template_engine/templates/containers/fedora_clang.dockerfile.j2
@@ -0,0 +1,8 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/fedora.dockerfile.j2' %}
+
+{% block extra_env_vars -%}
+#ENV CCACHE_CC=clang
+ENV CC=clang
+{%- endblock extra_env_vars %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/fedora_coverity.dockerfile.j2 b/containers/template_engine/templates/containers/fedora_coverity.dockerfile.j2
new file mode 100644
index 0000000..f17eb7a
--- /dev/null
+++ b/containers/template_engine/templates/containers/fedora_coverity.dockerfile.j2
@@ -0,0 +1,10 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2023 University of New Hampshire -#}
+{% extends 'containers/fedora.dockerfile.j2' %}
+
+{% block copy_extras -%}
+COPY scripts scripts
+COPY coverity coverity
+
+ENTRYPOINT /scripts/coverity.sh
+{%- endblock copy_extras %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/opensuse.dockerfile.j2 b/containers/template_engine/templates/containers/opensuse.dockerfile.j2
new file mode 100644
index 0000000..48d2502
--- /dev/null
+++ b/containers/template_engine/templates/containers/opensuse.dockerfile.j2
@@ -0,0 +1,10 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/rpm.dockerfile.j2' %}
+
+{% block pip_installs %}
+{% endblock %}
+
+{% block install_libabigail %}
+{# Install via package manager #}
+{% endblock install_libabigail %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/redhat_family.dockerfile.j2 b/containers/template_engine/templates/containers/redhat_family.dockerfile.j2
new file mode 100644
index 0000000..9ae6577
--- /dev/null
+++ b/containers/template_engine/templates/containers/redhat_family.dockerfile.j2
@@ -0,0 +1,5 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/rpm.dockerfile.j2' %}
+
+{# All of the distros in the Redhat Linux Lineage, ex: RHEL, Fedora, CentOS #}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/rhel.dockerfile.j2 b/containers/template_engine/templates/containers/rhel.dockerfile.j2
new file mode 100644
index 0000000..b50b2e9
--- /dev/null
+++ b/containers/template_engine/templates/containers/rhel.dockerfile.j2
@@ -0,0 +1,16 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/redhat_family.dockerfile.j2' %}
+
+{% block pip_installs %}
+RUN python3 -m pip install pyelftools
+{% endblock %}
+
+
+{% block before_meson_after_pip %}
+RUN yum clean all
+{% endblock %}
+
+{% block install_libabigail %}
+{# Install via package manager #}
+{% endblock install_libabigail %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/rhel7.dockerfile.j2 b/containers/template_engine/templates/containers/rhel7.dockerfile.j2
new file mode 100644
index 0000000..7045b99
--- /dev/null
+++ b/containers/template_engine/templates/containers/rhel7.dockerfile.j2
@@ -0,0 +1,15 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/rhel.dockerfile.j2' %}
+
+{% block pre_package_manager %}
+# repolist is needed to refresh the RHEL repos from the host this is being built on
+RUN yum repolist
+# Yes this next step is gross, there is no better way to enable the repos in the UBI containers.
+RUN sed -i '/\[rhel-7-server-extras-rpms\]/,/^ *\[/ s/enabled\ =\ 0/enabled\ =\ 1/' /etc/yum.repos.d/redhat.repo \
+    && sed -i '/\[rhel-7-server-optional-rpms\]/,/^ *\[/ s/enabled\ =\ 0/enabled\ =\ 1/' /etc/yum.repos.d/redhat.repo
+RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
+RUN yum update -y
+
+RUN yum groupinstall -y 'Development Tools'
+{% endblock %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/rhel8.dockerfile.j2 b/containers/template_engine/templates/containers/rhel8.dockerfile.j2
new file mode 100644
index 0000000..2824bfd
--- /dev/null
+++ b/containers/template_engine/templates/containers/rhel8.dockerfile.j2
@@ -0,0 +1,15 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/rhel.dockerfile.j2' %}
+
+{% block pre_package_manager %}
+# repolist is needed to refresh the RHEL repos from the host this is being built on
+RUN yum repolist
+RUN yum update -y
+RUN yum config-manager --set-enable codeready-builder-for-rhel-8-$(uname -i)-rpms
+
+# Required to install ccache
+RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm && yum upgrade -y
+
+RUN yum groupinstall -y 'Development Tools'
+{% endblock %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/rhel9.dockerfile.j2 b/containers/template_engine/templates/containers/rhel9.dockerfile.j2
new file mode 100644
index 0000000..695f573
--- /dev/null
+++ b/containers/template_engine/templates/containers/rhel9.dockerfile.j2
@@ -0,0 +1,19 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/rhel.dockerfile.j2' %}
+
+{% block pre_package_manager %}
+# repolist is needed to refresh the RHEL repos from the host this is being built on
+RUN yum repolist
+RUN yum config-manager --set-enable codeready-builder-for-rhel-9-$(uname -i)-rpms
+RUN yum update -y
+
+# Required to install ccache
+RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm && yum upgrade -y
+
+RUN yum groupinstall -y 'Development Tools'
+{% endblock %}
+
+{% block pip_installs %}
+RUN python3 -m pip install pyelftools ninja
+{% endblock %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/rpm.dockerfile.j2 b/containers/template_engine/templates/containers/rpm.dockerfile.j2
new file mode 100644
index 0000000..f386b42
--- /dev/null
+++ b/containers/template_engine/templates/containers/rpm.dockerfile.j2
@@ -0,0 +1,3 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/base.dockerfile.j2' %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/ubuntu.dockerfile.j2 b/containers/template_engine/templates/containers/ubuntu.dockerfile.j2
new file mode 100644
index 0000000..c52f866
--- /dev/null
+++ b/containers/template_engine/templates/containers/ubuntu.dockerfile.j2
@@ -0,0 +1,3 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/debian.dockerfile.j2' %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/ubuntu20.04.dockerfile.j2 b/containers/template_engine/templates/containers/ubuntu20.04.dockerfile.j2
new file mode 100644
index 0000000..59d2c28
--- /dev/null
+++ b/containers/template_engine/templates/containers/ubuntu20.04.dockerfile.j2
@@ -0,0 +1,12 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/ubuntu.dockerfile.j2' %}
+
+{% block pip_installs -%}
+RUN python3 -m pip install --no-cache-dir requests
+{%- endblock pip_installs %}
+
+{% block before_meson_after_pip -%}
+ADD https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.6.2.2472-linux.zip /
+ADD https://sonarcloud.io/static/cpp/build-wrapper-linux-x86.zip /
+{%- endblock %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/ubuntu22.04.dockerfile.j2 b/containers/template_engine/templates/containers/ubuntu22.04.dockerfile.j2
new file mode 100644
index 0000000..ba22471
--- /dev/null
+++ b/containers/template_engine/templates/containers/ubuntu22.04.dockerfile.j2
@@ -0,0 +1,3 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/ubuntu.dockerfile.j2' %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/ubuntu_cross.dockerfile.j2 b/containers/template_engine/templates/containers/ubuntu_cross.dockerfile.j2
new file mode 100644
index 0000000..236efbc
--- /dev/null
+++ b/containers/template_engine/templates/containers/ubuntu_cross.dockerfile.j2
@@ -0,0 +1,11 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/ubuntu20.04.dockerfile.j2' %}
+
+{% block cross_compilation_setup %}
+# Link ccache to different compilers
+    # aarch64 -> ccache
+RUN ln -s $(which ccache) /usr/local/bin/aarch64-linux-gnu-gcc && \
+    # aarch32 -> ccache
+    ln -s $(which ccache) /usr/local/bin/arm-linux-gnueabihf-gcc
+{% endblock cross_compilation_setup %}
\ No newline at end of file
diff --git a/containers/template_engine/templates/containers/ubuntu_sve.dockerfile.j2 b/containers/template_engine/templates/containers/ubuntu_sve.dockerfile.j2
new file mode 100644
index 0000000..5e940bf
--- /dev/null
+++ b/containers/template_engine/templates/containers/ubuntu_sve.dockerfile.j2
@@ -0,0 +1,12 @@ 
+{#- SPDX-License-Identifier: BSD-3-Clause -#}
+{#- Copyright (c) 2022 University of New Hampshire -#}
+{% extends 'containers/ubuntu20.04.dockerfile.j2' %}
+{% block cross_compilation_setup %}
+RUN ln -s $(which ccache) /usr/local/bin/gcc-10
+{% endblock cross_compilation_setup %}
+
+{% block build_abi %}
+# ABI is disabled for this container
+
+FROM {{ build_base_img }} AS {{ target.name }}
+{% endblock build_abi %}
\ No newline at end of file