diff --git a/Makefile.work b/Makefile.work index fe14eebaedc7..3ab97dc28f50 100644 --- a/Makefile.work +++ b/Makefile.work @@ -291,8 +291,8 @@ endif DOCKER_LOCKFILE_SAVE := $(DOCKER_LOCKDIR)/docker_save.lock $(shell mkdir -m 0777 -p $(DOCKER_LOCKDIR)) $(shell [ -f $(DOCKER_LOCKFILE_SAVE) ] || (touch $(DOCKER_LOCKFILE_SAVE) && chmod 0777 $(DOCKER_LOCKFILE_SAVE))) -$(shell [ -d $(DOCKER_ROOT) ] && docker run --rm -v $(DOCKER_ROOT)\:/mount debian sh -c 'rm -rf /mount/*') -$(mkdir -p $(DOCKER_ROOT)) +$(shell [ -d $(DOCKER_ROOT) ] && docker run --rm -v $(DOCKER_ROOT)\:/mount $(DEFAULT_CONTAINER_REGISTRY)debian:bookworm sh -c 'rm -rf /mount/*') +$(shell mkdir -p $(DOCKER_ROOT)) ifeq ($(DOCKER_BUILDER_MOUNT),) override DOCKER_BUILDER_MOUNT := "$(PWD):/sonic" @@ -302,6 +302,8 @@ ifeq ($(DOCKER_BUILDER_WORKDIR),) override DOCKER_BUILDER_WORKDIR := "/sonic" endif +# Consider removing the --ulimit flag once nothing older +# than Bullseye is being used as a slave container. DOCKER_RUN := docker run --rm=true --privileged --init \ -v $(DOCKER_BUILDER_MOUNT) \ -v "$(DOCKER_LOCKDIR):$(DOCKER_LOCKDIR)" \ @@ -310,6 +312,7 @@ DOCKER_RUN := docker run --rm=true --privileged --init \ -e "https_proxy=$(https_proxy)" \ -e "no_proxy=$(no_proxy)" \ -i$(shell { if [ -t 0 ]; then echo t; fi }) \ + --ulimit nofile=524288:524288 \ $(SONIC_BUILDER_EXTRA_CMDLINE) # Mount the $(DOCKER_ROOT) to /var/lib/docker in the slave container, the overlay fs is not supported as dockerd root folder. diff --git a/dockers/docker-base-bookworm/Dockerfile.j2 b/dockers/docker-base-bookworm/Dockerfile.j2 index 14032ed308f3..c6668cb698bd 100644 --- a/dockers/docker-base-bookworm/Dockerfile.j2 +++ b/dockers/docker-base-bookworm/Dockerfile.j2 @@ -1,26 +1,14 @@ {% set prefix = DEFAULT_CONTAINER_REGISTRY %} {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} {% if CONFIGURED_ARCH == "armhf" and (MULTIARCH_QEMU_ENVIRON == "y" or CROSS_BUILD_ENVIRON == "y") %} -FROM --platform=linux/arm/v7 {{ prefix }}debian:bookworm +ARG BASE=--platform=linux/arm/v7 {{ prefix }}debian:bookworm {% elif CONFIGURED_ARCH == "arm64" and (MULTIARCH_QEMU_ENVIRON == "y" or CROSS_BUILD_ENVIRON == "y") %} -FROM --platform=linux/arm64 {{ prefix }}debian:bookworm +ARG BASE=--platform=linux/arm64 {{ prefix }}debian:bookworm {% else %} -FROM {{ prefix }}{{DOCKER_BASE_ARCH}}/debian:bookworm +ARG BASE={{ prefix }}{{DOCKER_BASE_ARCH}}/debian:bookworm {% endif %} -# Clean documentation in FROM image -RUN find /usr/share/doc -depth \( -type f -o -type l \) ! -name copyright | xargs rm || true - -# Clean doc directories that are empty or only contain empty directories -RUN while [ -n "$(find /usr/share/doc -depth -type d -empty -print -exec rmdir {} +)" ]; do :; done && \ - rm -rf \ - /usr/share/man/* \ - /usr/share/groff/* \ - /usr/share/info/* \ - /usr/share/lintian/* \ - /usr/share/linda/* \ - /var/cache/man/* \ - /usr/share/locale/* +FROM $BASE AS base # Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -47,6 +35,8 @@ RUN apt update && \ python-is-python3 \ vim-tiny \ rsyslog \ +# Install rsync for copying over only changes between layers + rsync \ # Install redis-tools redis-tools \ # common dependencies @@ -98,13 +88,6 @@ RUN apt-get -y purge \ {{ install_debian_packages(docker_base_bookworm_debs.split(' ')) }} {%- endif %} -# Clean up apt -# Remove /var/lib/apt/lists/*, could be obsoleted for derived images -RUN apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /var/lib/apt/lists/* /tmp/* ~/.cache - COPY ["etc/rsyslog.conf", "/etc/rsyslog.conf"] COPY ["etc/rsyslog.d/*", "/etc/rsyslog.d/"] COPY ["root/.vimrc", "/root/.vimrc"] @@ -112,3 +95,7 @@ COPY ["root/.vimrc", "/root/.vimrc"] RUN ln /usr/bin/vim.tiny /usr/bin/vim COPY ["etc/supervisor/supervisord.conf", "/etc/supervisor/"] + +FROM scratch + +COPY --from=base / / diff --git a/dockers/docker-base-bullseye/Dockerfile.j2 b/dockers/docker-base-bullseye/Dockerfile.j2 index 0ec093c90164..57fe769b3208 100644 --- a/dockers/docker-base-bullseye/Dockerfile.j2 +++ b/dockers/docker-base-bullseye/Dockerfile.j2 @@ -1,26 +1,14 @@ {% set prefix = DEFAULT_CONTAINER_REGISTRY %} {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} {% if CONFIGURED_ARCH == "armhf" and (MULTIARCH_QEMU_ENVIRON == "y" or CROSS_BUILD_ENVIRON == "y") %} -FROM {{ prefix }}multiarch/debian-debootstrap:armhf-bullseye +ARG BASE={{ prefix }}multiarch/debian-debootstrap:armhf-bullseye {% elif CONFIGURED_ARCH == "arm64" and (MULTIARCH_QEMU_ENVIRON == "y" or CROSS_BUILD_ENVIRON == "y") %} -FROM {{ prefix }}multiarch/debian-debootstrap:arm64-bullseye +ARG BASE={{ prefix }}multiarch/debian-debootstrap:arm64-bullseye {% else %} -FROM {{ prefix }}{{DOCKER_BASE_ARCH}}/debian:bullseye +ARG BASE={{ prefix }}{{DOCKER_BASE_ARCH}}/debian:bullseye {% endif %} -# Clean documentation in FROM image -RUN find /usr/share/doc -depth \( -type f -o -type l \) ! -name copyright | xargs rm || true - -# Clean doc directories that are empty or only contain empty directories -RUN while [ -n "$(find /usr/share/doc -depth -type d -empty -print -exec rmdir {} +)" ]; do :; done && \ - rm -rf \ - /usr/share/man/* \ - /usr/share/groff/* \ - /usr/share/info/* \ - /usr/share/lintian/* \ - /usr/share/linda/* \ - /var/cache/man/* \ - /usr/share/locale/* +FROM $BASE AS base # Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -45,6 +33,8 @@ RUN apt-get update && \ python3-pip \ python-is-python3 \ vim-tiny \ +# Install rsync for copying over only changes between layers + rsync \ # Install redis-tools redis-tools \ # common dependencies @@ -100,13 +90,6 @@ RUN apt-get -y purge \ {{ install_debian_packages(docker_base_bullseye_debs.split(' ')) }} {%- endif %} -# Clean up apt -# Remove /var/lib/apt/lists/*, could be obsoleted for derived images -RUN apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /var/lib/apt/lists/* /tmp/* ~/.cache - COPY ["etc/rsyslog.conf", "/etc/rsyslog.conf"] COPY ["etc/rsyslog.d/*", "/etc/rsyslog.d/"] COPY ["root/.vimrc", "/root/.vimrc"] @@ -114,3 +97,7 @@ COPY ["root/.vimrc", "/root/.vimrc"] RUN ln /usr/bin/vim.tiny /usr/bin/vim COPY ["etc/supervisor/supervisord.conf", "/etc/supervisor/"] + +FROM scratch + +COPY --from=base / / diff --git a/dockers/docker-config-engine-bookworm/Dockerfile.j2 b/dockers/docker-config-engine-bookworm/Dockerfile.j2 index c7c1d9cdc825..a2c5613c8e9d 100644 --- a/dockers/docker-config-engine-bookworm/Dockerfile.j2 +++ b/dockers/docker-config-engine-bookworm/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-base-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-base-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -49,10 +51,17 @@ COPY ["files/readiness_probe.sh", "/usr/bin/"] COPY ["files/container_startup.py", "/usr/share/sonic/scripts/"] ## Clean up -RUN apt-get purge -y \ - python3-dev \ - build-essential && \ - apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs /python-wheels ~/.cache + +{%- if CONFIGURED_ARCH == "armhf" or CONFIGURED_ARCH == "arm64" %} +RUN apt-get purge -y \ + libxslt-dev \ + libz-dev +{%- endif %} + +RUN apt-get purge -y \ + python3-dev \ + build-essential + +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / diff --git a/dockers/docker-config-engine-bullseye/Dockerfile.j2 b/dockers/docker-config-engine-bullseye/Dockerfile.j2 index 700af660a91d..4db1ded49268 100644 --- a/dockers/docker-config-engine-bullseye/Dockerfile.j2 +++ b/dockers/docker-config-engine-bullseye/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-base-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-base-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -59,3 +61,7 @@ RUN apt-get purge -y \ apt-get autoclean -y && \ apt-get autoremove -y && \ rm -rf /debs /python-wheels ~/.cache + +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / diff --git a/dockers/docker-database/Dockerfile.j2 b/dockers/docker-database/Dockerfile.j2 index d9ba01360b30..e8703c05d570 100644 --- a/dockers/docker-database/Dockerfile.j2 +++ b/dockers/docker-database/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name @@ -23,12 +25,8 @@ RUN pip3 install click {{ install_debian_packages(docker_database_debs.split(' ')) }} {%- endif %} -# Clean up -RUN apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs ~/.cache && \ - sed -ri 's/^# save ""$/save ""/g; \ +# Configure redis settings +RUN sed -ri 's/^# save ""$/save ""/g; \ s/^daemonize yes$/daemonize no/; \ s/^logfile .*$/logfile ""/; \ s/^# syslog-enabled no$/syslog-enabled no/; \ @@ -50,4 +48,9 @@ COPY ["files/update_chassisdb_config", "/usr/local/bin/"] COPY ["flush_unused_database", "/usr/local/bin/"] COPY ["multi_database_config.json.j2", "/usr/share/sonic/templates/"] +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/docker-database-init.sh"] diff --git a/dockers/docker-dhcp-relay/Dockerfile.j2 b/dockers/docker-dhcp-relay/Dockerfile.j2 index 40e65381eacf..fc0f62e3fbcc 100644 --- a/dockers/docker-dhcp-relay/Dockerfile.j2 +++ b/dockers/docker-dhcp-relay/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name ARG image_version @@ -7,9 +9,6 @@ ARG image_version # Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive -# Pass the image_version to container -ENV IMAGE_VERSION=$image_version - # Update apt's cache of available packages RUN apt-get update @@ -38,10 +37,6 @@ RUN pip3 install psutil # Clean up RUN apt-get remove -y build-essential \ python3-dev -RUN apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs COPY ["docker_init.sh", "start.sh", "/usr/bin/"] COPY ["docker-dhcp-relay.supervisord.conf.j2", "port-name-alias-map.txt.j2", "wait_for_intf.sh.j2", "/usr/share/sonic/templates/"] @@ -50,4 +45,13 @@ COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor"] COPY ["cli", "/cli/"] +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +# Pass the image_version to container +ENV IMAGE_VERSION=$image_version + +ENV DEBIAN_FRONTEND=noninteractive + ENTRYPOINT ["/usr/bin/docker_init.sh"] diff --git a/dockers/docker-dhcp-server/Dockerfile.j2 b/dockers/docker-dhcp-server/Dockerfile.j2 index 3b4bf7587919..b2efd41007a4 100755 --- a/dockers/docker-dhcp-server/Dockerfile.j2 +++ b/dockers/docker-dhcp-server/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name ARG image_version @@ -7,9 +9,6 @@ ARG image_version ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive -# Pass the image_version to container -ENV IMAGE_VERSION=$image_version - RUN apt-get update && \ apt-get install -f -y \ tcpdump \ @@ -41,11 +40,6 @@ RUN pip3 install psutil RUN apt-get remove -y build-essential \ python3-dev -RUN apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs - COPY ["docker_init.sh", "start.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] @@ -55,4 +49,12 @@ COPY ["lease_update.sh", "/etc/kea/"] COPY ["kea-dhcp4-init.conf", "/etc/kea/kea-dhcp4.conf"] COPY ["cli", "/cli/"] +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +# Pass the image_version to container +ENV IMAGE_VERSION=$image_version + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/bin/docker_init.sh"] diff --git a/dockers/docker-eventd/Dockerfile.j2 b/dockers/docker-eventd/Dockerfile.j2 index 8e2f905f7860..20d9f39ba965 100644 --- a/dockers/docker-eventd/Dockerfile.j2 +++ b/dockers/docker-eventd/Dockerfile.j2 @@ -1,16 +1,14 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name ARG image_version -RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf # Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive -# Pass the image_version to container -ENV IMAGE_VERSION=$image_version - # Update apt's cache of available packages RUN apt-get update @@ -22,12 +20,6 @@ RUN apt-get update {{ install_debian_packages(docker_eventd_debs.split(' ')) }} {%- endif %} -# Clean up -RUN apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs - RUN mkdir -p /etc/rsyslog.d/rsyslog_plugin_conf COPY ["start.sh", "/usr/bin/"] @@ -51,4 +43,12 @@ RUN rm -f /etc/rsyslog.d/rsyslog_plugin_conf/dhcp_relay_events_info.json RUN rm -f /etc/rsyslog.d/rsyslog_plugin_conf/swss_events_info.json RUN rm -f /etc/rsyslog.d/rsyslog_plugin_conf/syncd_events_info.json +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +# Pass the image_version to container +ENV IMAGE_VERSION=$image_version + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/dockers/docker-fpm-frr/Dockerfile.j2 b/dockers/docker-fpm-frr/Dockerfile.j2 index 7a4a7f9bb55f..8a840b27421f 100644 --- a/dockers/docker-fpm-frr/Dockerfile.j2 +++ b/dockers/docker-fpm-frr/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-swss-layer-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-swss-layer-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name ARG frr_user_uid @@ -13,10 +15,8 @@ ENV DEBIAN_FRONTEND=noninteractive # Install required packages RUN apt-get update && \ apt-get install -y \ - libc-ares2 \ iproute2 \ - logrotate \ - libunwind8 + logrotate RUN groupadd -g ${frr_user_gid} frr RUN useradd -u ${frr_user_uid} -g ${frr_user_gid} -M -s /bin/false frr @@ -39,12 +39,6 @@ RUN useradd -u ${frr_user_uid} -g ${frr_user_gid} -M -s /bin/false frr RUN chown -R ${frr_user_uid}:${frr_user_gid} /etc/frr/ -# Clean up -RUN apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs ~/.cache /python-wheels - COPY ["frr", "/usr/share/sonic/templates"] COPY ["docker_init.sh", "/usr/bin/"] COPY ["snmp.conf", "/etc/snmp/frr.conf"] @@ -59,4 +53,10 @@ RUN chmod a+x /usr/bin/TSA && \ chmod a+x /usr/bin/TSC && \ chmod a+x /usr/bin/zsocket.sh +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +ENV DEBIAN_FRONTEND=noninteractive + ENTRYPOINT ["/usr/bin/docker_init.sh"] diff --git a/dockers/docker-iccpd/Dockerfile.j2 b/dockers/docker-iccpd/Dockerfile.j2 index 78f2648847ce..3feed1568e3d 100644 --- a/dockers/docker-iccpd/Dockerfile.j2 +++ b/dockers/docker-iccpd/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-swss-layer-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-swss-layer-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name @@ -9,25 +11,23 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && \ apt-get install -y iptables -COPY \ -{% for deb in docker_iccpd_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor -%} -debs/ +{% if docker_iccpd_debs.strip() -%} +# Copy built Debian packages +{{ copy_files("debs/", docker_iccpd_debs.split(' '), "/debs/") }} -RUN dpkg -i \ -{% for deb in docker_iccpd_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor %} +# Install built Debian packages and implicitly install their dependencies +{{ install_debian_packages(docker_iccpd_debs.split(' ')) }} +{%- endif %} COPY ["start.sh", "iccpd.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["iccpd.j2", "/usr/share/sonic/templates/"] RUN chmod +x /usr/bin/start.sh /usr/bin/iccpd.sh -RUN apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/dockers/docker-lldp/Dockerfile.j2 b/dockers/docker-lldp/Dockerfile.j2 index e1b8f1a32efb..9cf9871b0c2b 100644 --- a/dockers/docker-lldp/Dockerfile.j2 +++ b/dockers/docker-lldp/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name ARG image_version @@ -29,14 +31,6 @@ RUN apt-get update {{ install_python_wheels(docker_lldp_whls.split(' ')) }} {% endif %} -# Clean up -RUN apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs \ - /python-wheels \ - ~/.cache - COPY ["docker-lldp-init.sh", "/usr/bin/"] COPY ["start.sh", "/usr/bin/"] COPY ["waitfor_lldp_ready.sh", "/usr/bin/"] @@ -48,4 +42,12 @@ COPY ["lldpmgrd", "/usr/bin/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor"] +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +# Pass the image_version to container +ENV IMAGE_VERSION=$image_version + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/bin/docker-lldp-init.sh"] diff --git a/dockers/docker-macsec/Dockerfile.j2 b/dockers/docker-macsec/Dockerfile.j2 index e616a5569b32..6b13e0af400f 100644 --- a/dockers/docker-macsec/Dockerfile.j2 +++ b/dockers/docker-macsec/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-swss-layer-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-swss-layer-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name @@ -16,15 +18,15 @@ RUN apt-get update {{ install_debian_packages(docker_macsec_debs.split(' ')) }} {%- endif %} -RUN apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs - COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor"] COPY ["etc/wpa_supplicant.conf", "/etc/wpa_supplicant.conf"] COPY ["cli", "/cli/"] +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/dockers/docker-mux/Dockerfile.j2 b/dockers/docker-mux/Dockerfile.j2 index 8bb6ca909094..28dd592e85e3 100755 --- a/dockers/docker-mux/Dockerfile.j2 +++ b/dockers/docker-mux/Dockerfile.j2 @@ -1,14 +1,14 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive -RUN apt-get update && \ - apt-get install -f -y \ - libmnl0 +RUN apt-get update {% if docker_mux_debs.strip() -%} # Copy locally-built Debian package dependencies @@ -18,12 +18,6 @@ RUN apt-get update && \ {{ install_debian_packages(docker_mux_debs.split(' ')) }} {%- endif %} -## Clean up -RUN apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs - COPY ["docker-init.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] @@ -32,4 +26,9 @@ COPY ["critical_processes", "/etc/supervisor/"] ## Copy all Jinja2 template files into the templates folder COPY ["*.j2", "/usr/share/sonic/templates/"] +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/bin/docker-init.sh"] diff --git a/dockers/docker-nat/Dockerfile.j2 b/dockers/docker-nat/Dockerfile.j2 index 821c194a48e2..d8af37f0c502 100644 --- a/dockers/docker-nat/Dockerfile.j2 +++ b/dockers/docker-nat/Dockerfile.j2 @@ -1,9 +1,9 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, copy_files %} -FROM docker-swss-layer-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-swss-layer-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} -ARG docker_container_name +FROM $BASE as base -RUN echo +ARG docker_container_name ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -12,8 +12,6 @@ ENV DEBIAN_FRONTEND=noninteractive ## TODO: implicitly install dependencies RUN apt-get update \ && apt-get install -f -y \ - libelf1 \ - libmnl0 \ bridge-utils \ conntrack @@ -31,7 +29,9 @@ COPY ["restore_nat_entries.py", "/usr/bin/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor"] -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /debs +FROM $BASE +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index b03f13e749ca..1c12364ae2b2 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-swss-layer-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-swss-layer-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name @@ -13,16 +15,12 @@ RUN apt-get update && \ iproute2 \ ndisc6 \ tcpdump \ - libelf1 \ - libmnl0 \ bridge-utils \ conntrack \ ndppd \ python3-protobuf \ pciutils \ - # Needed for installing netifaces Python package - build-essential \ - python3-dev + python3-netifaces {% if ( CONFIGURED_ARCH == "armhf" or CONFIGURED_ARCH == "arm64" ) %} # Fix for gcc/python/iputils-ping not found in arm docker @@ -32,9 +30,7 @@ RUN apt-get install -y \ {% endif %} # Dependencies of restore_neighbors.py -RUN pip3 install \ - pyroute2==0.5.14 \ - netifaces==0.10.9 +RUN pip3 install pyroute2==0.5.14 {% if ( CONFIGURED_ARCH == "armhf" or CONFIGURED_ARCH == "arm64" ) %} # Remove installed gcc @@ -58,13 +54,7 @@ RUN apt-get remove -y gcc {% endif %} # Clean up -RUN apt-get purge -y \ - build-essential \ - python3-dev && \ - apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs ~/.cache +RUN apt-get purge -y build-essential python3-dev COPY ["files/arp_update", "/usr/bin"] COPY ["arp_update.conf", "files/arp_update_vars.j2", "/usr/share/sonic/templates/"] @@ -80,4 +70,10 @@ RUN sonic-cfggen -a "{\"ENABLE_ASAN\":\"{{ENABLE_ASAN}}\"}" -t /usr/share/sonic/ RUN rm -f /usr/share/sonic/templates/docker-init.j2 RUN chmod 755 /usr/bin/docker-init.sh +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +ENV DEBIAN_FRONTEND=noninteractive + ENTRYPOINT ["/usr/bin/docker-init.sh"] diff --git a/dockers/docker-platform-monitor/Dockerfile.j2 b/dockers/docker-platform-monitor/Dockerfile.j2 index 3f9e19f5007d..1006acd642dc 100755 --- a/dockers/docker-platform-monitor/Dockerfile.j2 +++ b/dockers/docker-platform-monitor/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name ARG image_version @@ -24,6 +26,7 @@ RUN apt-get update && \ i2c-tools \ psmisc \ python3-jsonschema \ + python3-netifaces \ libpci3 \ iputils-ping \ pciutils \ @@ -46,8 +49,8 @@ RUN apt-get install -y -t bookworm-backports \ RUN pip3 install grpcio==1.51.1 \ grpcio-tools==1.51.1 -# Barefoot platform vendors' sonic_platform packages import these Python libraries -RUN pip3 install thrift==0.13.0 netifaces +# Barefoot platform vendors' sonic_platform packages import these Python libraries (and netifaces) +RUN pip3 install thrift==0.13.0 # Ragile platform vendors' sonic_platform packages import these Python libraries RUN pip3 install requests @@ -90,13 +93,7 @@ RUN pip3 install blkinfo # Clean up RUN apt-get purge -y \ build-essential \ - python3-dev && \ - apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs \ - /python-wheels \ - ~/.cache + python3-dev COPY ["lm-sensors.sh", "/usr/bin/"] COPY ["docker-pmon.supervisord.conf.j2", "docker_init.j2", "/usr/share/sonic/templates/"] @@ -110,4 +107,12 @@ RUN sonic-cfggen -a "{\"CONFIGURED_PLATFORM\":\"{{CONFIGURED_PLATFORM}}\"}" -t / RUN rm -f /usr/share/sonic/templates/docker_init.j2 RUN chmod 755 /usr/bin/docker_init.sh +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +# Pass the image_version to container +ENV IMAGE_VERSION=$image_version + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/bin/docker_init.sh"] diff --git a/dockers/docker-router-advertiser/Dockerfile.j2 b/dockers/docker-router-advertiser/Dockerfile.j2 index 3818453fb2be..e93885d6c393 100644 --- a/dockers/docker-router-advertiser/Dockerfile.j2 +++ b/dockers/docker-router-advertiser/Dockerfile.j2 @@ -1,9 +1,10 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name ARG image_version -RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf # Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -25,16 +26,18 @@ RUN apt-get -y install radvd {{ install_debian_packages(docker_router_advertiser_debs.split(' ')) }} {%- endif %} -# Clean up -RUN apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs - COPY ["start.sh", "/usr/bin/"] COPY ["docker-init.sh", "/usr/bin/"] COPY ["radvd.conf.j2", "wait_for_link.sh.j2", "docker-router-advertiser.supervisord.conf.j2", "/usr/share/sonic/templates/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor"] +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +# Pass the image_version to container +ENV IMAGE_VERSION=$image_version + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/bin/docker-init.sh"] diff --git a/dockers/docker-sflow/Dockerfile.j2 b/dockers/docker-sflow/Dockerfile.j2 index 75ad9169cec5..4d5d04df67a1 100644 --- a/dockers/docker-sflow/Dockerfile.j2 +++ b/dockers/docker-sflow/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-swss-layer-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-swss-layer-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name @@ -8,8 +10,7 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && \ apt-get install -f -y \ - dmidecode \ - libmnl0 + dmidecode {% if docker_sflow_debs.strip() -%} # Copy locally-built Debian package dependencies @@ -19,11 +20,6 @@ RUN apt-get update && \ {{ install_debian_packages(docker_sflow_debs.split(' ')) }} {%- endif %} -RUN apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs - RUN sed -ri '/^DAEMON_ARGS=""/c DAEMON_ARGS="-c /var/log/hsflowd.crash"' /etc/init.d/hsflowd COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] @@ -31,4 +27,9 @@ COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor"] COPY ["port_index_mapper.py", "/usr/bin"] +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/dockers/docker-snmp/Dockerfile.j2 b/dockers/docker-snmp/Dockerfile.j2 index d073e20ef910..947c431beabb 100644 --- a/dockers/docker-snmp/Dockerfile.j2 +++ b/dockers/docker-snmp/Dockerfile.j2 @@ -1,11 +1,13 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python3_wheels, copy_files %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name ARG image_version # Enable -O for all Python calls -ENV PYTHONOPTIMIZE 1 +ENV PYTHONOPTIMIZE=1 # Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -30,15 +32,6 @@ RUN apt-get update && \ {{ install_debian_packages(docker_snmp_debs.split(' ')) }} {%- endif %} -# Fix for hiredis compilation issues for ARM -# python will throw for missing locale -RUN apt-get install -y locales -RUN locale-gen "en_US.UTF-8" -RUN dpkg-reconfigure --frontend noninteractive locales -ENV LC_CTYPE=en_US.UTF-8 -RUN sed -i '/^#.* en_US.* /s/^#//' /etc/locale.gen -RUN locale-gen - # Install dependencies used by some plugins RUN pip3 install --no-cache-dir \ hiredis \ @@ -59,12 +52,7 @@ RUN python3 -m sonic_ax_impl install RUN apt-get -y purge \ python3-dev \ gcc \ - make && \ - apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y --purge && \ - find / | grep -E "__pycache__" | xargs rm -rf && \ - rm -rf /debs /python-wheels ~/.cache + make COPY ["docker-snmp-init.sh", "/usr/bin/"] COPY ["start.sh", "/usr/bin/"] @@ -77,4 +65,18 @@ COPY ["critical_processes", "/etc/supervisor"] EXPOSE 161/udp 162/udp RUN chmod +x /usr/bin/docker-snmp-init.sh + +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +# Enable -O for all Python calls +ENV PYTHONOPTIMIZE=1 + +# Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +# Pass the image_version to container +ENV IMAGE_VERSION=$image_version + ENTRYPOINT ["/usr/bin/docker-snmp-init.sh"] diff --git a/dockers/docker-sonic-bmp/Dockerfile.j2 b/dockers/docker-sonic-bmp/Dockerfile.j2 index 2e79001dbf92..5bc577f928c8 100755 --- a/dockers/docker-sonic-bmp/Dockerfile.j2 +++ b/dockers/docker-sonic-bmp/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name ARG image_version @@ -28,11 +30,7 @@ RUN apt-get update {{ install_python_wheels(docker_sonic_bmp_whls.split(' ')) }} {% endif %} -RUN apt-get clean -y && \ - apt-get autoclean - && \ - apt-get autoremove -y && \ - rm -rf /debs && \ - mkdir -p /etc/bmp +RUN mkdir -p /etc/bmp COPY ["bmp.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] @@ -42,9 +40,9 @@ COPY ["critical_processes", "/etc/supervisor/"] RUN chmod +x /usr/bin/bmp.sh RUN touch /var/log/openbmpd.log -RUN apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / -ENTRYPOINT ["/usr/local/bin/supervisord"] \ No newline at end of file +ENV DEBIAN_FRONTEND=noninteractive +ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/dockers/docker-sonic-gnmi/Dockerfile.j2 b/dockers/docker-sonic-gnmi/Dockerfile.j2 index 7298a05978be..c8e784a6e187 100644 --- a/dockers/docker-sonic-gnmi/Dockerfile.j2 +++ b/dockers/docker-sonic-gnmi/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name ARG image_version @@ -20,15 +22,20 @@ RUN apt-get update {{ install_debian_packages(docker_sonic_gnmi_debs.split(' ')) }} {%- endif %} -RUN apt-get clean -y && \ - apt-get autoclean - && \ - apt-get autoremove -y && \ - rm -rf /debs - COPY ["start.sh", "gnmi-native.sh", "dialout.sh", "/usr/bin/"] COPY ["telemetry_vars.j2", "/usr/share/sonic/templates/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor"] +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +# Pass the image_version to container +ENV IMAGE_VERSION=$image_version + ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/dockers/docker-sonic-mgmt-framework/Dockerfile.j2 b/dockers/docker-sonic-mgmt-framework/Dockerfile.j2 index 91f7ba7ee736..661466d68fe8 100644 --- a/dockers/docker-sonic-mgmt-framework/Dockerfile.j2 +++ b/dockers/docker-sonic-mgmt-framework/Dockerfile.j2 @@ -1,4 +1,7 @@ -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +{% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name @@ -11,23 +14,23 @@ RUN apt-get update && \ RUN pip3 install requests \ urllib3 -COPY \ -{% for deb in docker_sonic_mgmt_framework_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor -%} -debs/ +{% if docker_sonic_mgmt_framework_debs.strip() -%} +# Copy built Debian packages +{{ copy_files("debs/", docker_sonic_mgmt_framework_debs.split(' '), "/debs/") }} -RUN dpkg -i \ -{% for deb in docker_sonic_mgmt_framework_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor %} +# Install built Debian packages and implicitly install their dependencies +{{ install_debian_packages(docker_sonic_mgmt_framework_debs.split(' ')) }} +{%- endif %} COPY ["start.sh", "rest-server.sh", "/usr/bin/"] COPY ["mgmt_vars.j2", "/usr/share/sonic/templates/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] RUN apt-get remove -y g++ python3-dev -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /debs ~/.cache +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/dockers/docker-sonic-p4rt/Dockerfile.j2 b/dockers/docker-sonic-p4rt/Dockerfile.j2 index 994bc3a5e211..d5fc4cabe2b0 100644 --- a/dockers/docker-sonic-p4rt/Dockerfile.j2 +++ b/dockers/docker-sonic-p4rt/Dockerfile.j2 @@ -1,9 +1,10 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name ARG git_commit -RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -18,15 +19,15 @@ RUN apt-get update {{ install_debian_packages(docker_sonic_p4rt_debs.split(' ')) }} {%- endif %} -RUN apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs - COPY ["start.sh", "p4rt.sh", "/usr/bin/"] COPY ["p4rt_vars.j2", "/usr/share/sonic/templates/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor"] +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/dockers/docker-sonic-restapi/Dockerfile.j2 b/dockers/docker-sonic-restapi/Dockerfile.j2 index 3bb1ab7df3ba..17b2765292a8 100644 --- a/dockers/docker-sonic-restapi/Dockerfile.j2 +++ b/dockers/docker-sonic-restapi/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name @@ -16,12 +18,14 @@ RUN apt-get update {{ install_debian_packages( docker_sonic_restapi_debs.split(' ')) }} {%- endif %} -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y - COPY ["start.sh", "restapi.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor"] +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/dockers/docker-sonic-telemetry/Dockerfile.j2 b/dockers/docker-sonic-telemetry/Dockerfile.j2 index 88aceca4c877..0c03f66c5945 100644 --- a/dockers/docker-sonic-telemetry/Dockerfile.j2 +++ b/dockers/docker-sonic-telemetry/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-sonic-gnmi-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name ARG image_version @@ -20,14 +22,19 @@ RUN apt-get update {{ install_debian_packages(docker_sonic_telemetry_debs.split(' ')) }} {%- endif %} -RUN apt-get clean -y && \ - apt-get autoclean - && \ - apt-get autoremove -y && \ - rm -rf /debs - COPY ["start.sh", "telemetry.sh", "dialout.sh", "/usr/bin/"] COPY ["telemetry_vars.j2", "/usr/share/sonic/templates/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["critical_processes", "/etc/supervisor"] +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +# Pass the image_version to container +ENV IMAGE_VERSION=$image_version + ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/dockers/docker-swss-layer-bookworm/Dockerfile.j2 b/dockers/docker-swss-layer-bookworm/Dockerfile.j2 index 4c9b578ebc33..af3122465b52 100644 --- a/dockers/docker-swss-layer-bookworm/Dockerfile.j2 +++ b/dockers/docker-swss-layer-bookworm/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -16,9 +18,8 @@ RUN apt-get install iputils-ping {{ install_debian_packages(docker_swss_layer_bookworm_debs.split(' ')) }} {%- endif %} -RUN apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/dockers/docker-swss-layer-bullseye/Dockerfile.j2 b/dockers/docker-swss-layer-bullseye/Dockerfile.j2 index cd250698dace..6949326ce713 100644 --- a/dockers/docker-swss-layer-bullseye/Dockerfile.j2 +++ b/dockers/docker-swss-layer-bullseye/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -16,9 +18,8 @@ RUN apt-get install iputils-ping {{ install_debian_packages(docker_swss_layer_bullseye_debs.split(' ')) }} {%- endif %} -RUN apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/dockers/docker-teamd/Dockerfile.j2 b/dockers/docker-teamd/Dockerfile.j2 index b128a7c94340..9caf7eaff76d 100644 --- a/dockers/docker-teamd/Dockerfile.j2 +++ b/dockers/docker-teamd/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-swss-layer-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-swss-layer-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name @@ -16,14 +18,14 @@ RUN apt-get update {{ install_debian_packages(docker_teamd_debs.split(' ')) }} {%- endif %} -RUN apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs - COPY ["start.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor"] +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/files/build_templates/build_docker_cache.j2 b/files/build_templates/build_docker_cache.j2 index 9f1d0eebf77f..ef770db54d14 100644 --- a/files/build_templates/build_docker_cache.j2 +++ b/files/build_templates/build_docker_cache.j2 @@ -2,10 +2,10 @@ FROM {{IMAGENAME}} # Copy the cache data to host -From scratch as output +FROM scratch AS output COPY --from={{IMAGENAME}} /cache.tgz cache.tgz # Clean up the cache data -FROM {{IMAGENAME}} as final +FROM {{IMAGENAME}} AS final RUN rm /cache.tgz diff --git a/platform/broadcom/docker-syncd-brcm-dnx-rpc/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm-dnx-rpc/Dockerfile.j2 index ac0e4ea33662..ed4ea877e5fe 100644 --- a/platform/broadcom/docker-syncd-brcm-dnx-rpc/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm-dnx-rpc/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-syncd-brcm-dnx-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-syncd-brcm-dnx-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -19,7 +21,6 @@ RUN apt-get update \ libffi-dev \ wget \ cmake \ - libnanomsg5 \ libnanomsg-dev \ libthrift-0.17.0 @@ -64,9 +65,9 @@ RUN apt-get -y purge \ libthrift-dev \ build-essential -RUN apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/platform/broadcom/docker-syncd-brcm-dnx/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm-dnx/Dockerfile.j2 index 6bceef873d59..88c53c934cd9 100755 --- a/platform/broadcom/docker-syncd-brcm-dnx/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm-dnx/Dockerfile.j2 @@ -1,5 +1,7 @@ -{% from "dockers/dockerfile-macros.j2" import install_debian_packages %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +{% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name @@ -8,14 +10,13 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update -COPY \ -{% for deb in docker_syncd_brcm_dnx_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor -%} -debs/ +{% if docker_syncd_brcm_dnx_debs.strip() -%} +# Copy locally-built Debian package dependencies +{{ copy_files("debs/", docker_syncd_brcm_dnx_debs.split(' '), "/debs/") }} # Install locally-built Debian packages and implicitly install their dependencies {{ install_debian_packages(docker_syncd_brcm_dnx_debs.split(' ')) }} +{%- endif %} ## TODO: add kmod into Depends RUN apt-get install -yf kmod @@ -30,8 +31,9 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor/"] -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /debs +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 index 1ef8fb29a8d2..cdd6dc3530a6 100644 --- a/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-syncd-brcm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-syncd-brcm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -19,7 +21,6 @@ RUN apt-get update \ libffi-dev \ wget \ cmake \ - libnanomsg5 \ libnanomsg-dev \ libthrift-0.17.0 @@ -64,9 +65,9 @@ RUN apt-get -y purge \ libthrift-dev \ build-essential -RUN apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 index 4dd4dbc0b219..a64d80482222 100755 --- a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 @@ -1,5 +1,7 @@ -{% from "dockers/dockerfile-macros.j2" import install_debian_packages %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +{% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name @@ -8,14 +10,13 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update -COPY \ -{% for deb in docker_syncd_brcm_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor -%} -debs/ +{% if docker_syncd_brcm_debs.strip() -%} +# Copy locally-built Debian package dependencies +{{ copy_files("debs/", docker_syncd_brcm_debs.split(' '), "/debs/") }} # Install locally-built Debian packages and implicitly install their dependencies {{ install_debian_packages(docker_syncd_brcm_debs.split(' ')) }} +{%- endif %} ## TODO: add kmod into Depends RUN apt-get install -yf kmod @@ -30,8 +31,9 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor/"] -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /debs +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/platform/components/docker-gbsyncd-broncos/Dockerfile.j2 b/platform/components/docker-gbsyncd-broncos/Dockerfile.j2 index 3bb3f402098e..61e789f2370c 100644 --- a/platform/components/docker-gbsyncd-broncos/Dockerfile.j2 +++ b/platform/components/docker-gbsyncd-broncos/Dockerfile.j2 @@ -1,4 +1,6 @@ -FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name @@ -35,8 +37,8 @@ COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["files/dsserve", "/usr/bin/"] RUN chmod +x /usr/bin/dsserve -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /debs +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / ENTRYPOINT ["/usr/bin/docker-init.sh"] diff --git a/platform/components/docker-gbsyncd-credo/Dockerfile.j2 b/platform/components/docker-gbsyncd-credo/Dockerfile.j2 index 24fef740dc34..046d12ae34ef 100644 --- a/platform/components/docker-gbsyncd-credo/Dockerfile.j2 +++ b/platform/components/docker-gbsyncd-credo/Dockerfile.j2 @@ -1,4 +1,6 @@ -FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name @@ -33,8 +35,8 @@ COPY ["supervisord.conf.j2", "/usr/share/sonic/templates"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /debs +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / ENTRYPOINT ["/usr/bin/docker-init.sh"] diff --git a/platform/marvell-prestera/docker-saiserver-mrvl-prestera/Dockerfile.j2 b/platform/marvell-prestera/docker-saiserver-mrvl-prestera/Dockerfile.j2 index 21b0bcce8017..e782bc8cb330 100644 --- a/platform/marvell-prestera/docker-saiserver-mrvl-prestera/Dockerfile.j2 +++ b/platform/marvell-prestera/docker-saiserver-mrvl-prestera/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name @@ -32,4 +34,9 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/platform/marvell-prestera/docker-syncd-mrvl-prestera-rpc/Dockerfile.j2 b/platform/marvell-prestera/docker-syncd-mrvl-prestera-rpc/Dockerfile.j2 index 4e18df32a378..b75708b02bed 100644 --- a/platform/marvell-prestera/docker-syncd-mrvl-prestera-rpc/Dockerfile.j2 +++ b/platform/marvell-prestera/docker-syncd-mrvl-prestera-rpc/Dockerfile.j2 @@ -1,15 +1,11 @@ -FROM docker-syncd-mrvl-prestera-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} -{% from "dockers/dockerfile-macros.j2" import install_python_wheels, copy_files %} +{% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} +ARG BASE=docker-syncd-mrvl-prestera-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive -COPY \ -{% for deb in docker_syncd_mrvl_prestera_rpc_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor -%} -debs/ - RUN apt-get purge -y syncd ## Pre-install the fundamental packages ## @@ -30,10 +26,12 @@ RUN apt-get update \ libnanomsg5 \ libnanomsg-dev -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } ; \ -{% for deb in docker_syncd_mrvl_prestera_rpc_debs.split(' ') -%} -dpkg_apt debs/{{ deb }}{{'; '}} -{%- endfor %} +{% if docker_syncd_mrvl_prestera_rpc_debs.strip() -%} +# Copy built Debian packages +{{ copy_files("debs/", docker_syncd_mrvl_prestera_rpc_debs.split(' '), "/debs/") }} +# Install built Debian packages and implicitly install their dependencies +{{ install_debian_packages(docker_syncd_mrvl_prestera_rpc_debs.split(' ')) }} +{%- endif %} RUN pip3 install cffi \ && pip3 install nnpy \ @@ -53,7 +51,11 @@ COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] ## Clean up RUN apt-get purge -y libyaml-dev python3-dev libffi-dev libssl-dev wget build-essential -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /root/deps +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/platform/marvell-prestera/docker-syncd-mrvl-prestera/Dockerfile.j2 b/platform/marvell-prestera/docker-syncd-mrvl-prestera/Dockerfile.j2 index a67a19a00b57..ec747248d25f 100755 --- a/platform/marvell-prestera/docker-syncd-mrvl-prestera/Dockerfile.j2 +++ b/platform/marvell-prestera/docker-syncd-mrvl-prestera/Dockerfile.j2 @@ -1,5 +1,7 @@ -{% from "dockers/dockerfile-macros.j2" import install_debian_packages %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +{% from "dockers/dockerfile-macros.j2" import install_debian_packages, copy_files %} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name @@ -8,12 +10,6 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update -COPY \ -{% for deb in docker_syncd_mrvl_prestera_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor -%} -debs/ - RUN apt-get update \ && apt-get -y install \ net-tools \ @@ -21,17 +17,20 @@ RUN apt-get update \ RUN apt-get -y install libpcap-dev libxml2-dev python3-dev swig -RUN dpkg -i \ -{% for deb in docker_syncd_mrvl_prestera_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor %} +{% if docker_syncd_mrvl_prestera_debs.strip() -%} +# Copy locally-built Debian package dependencies +{{ copy_files("debs/", docker_syncd_mrvl_prestera_debs.split(' '), "/debs/") }} +# Install locally-built Debian packages and implicitly install their dependencies +{{ install_debian_packages(docker_syncd_mrvl_prestera_debs.split(' ')) }} +{%- endif %} COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin/"] COPY ["critical_processes", "/etc/supervisor/"] -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /debs +FROM $BASE +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/platform/marvell-teralynx/docker-saiserver-mrvl-teralynx/Dockerfile.j2 b/platform/marvell-teralynx/docker-saiserver-mrvl-teralynx/Dockerfile.j2 index 2dd04f57f4e7..b2af9ca7033f 100644 --- a/platform/marvell-teralynx/docker-saiserver-mrvl-teralynx/Dockerfile.j2 +++ b/platform/marvell-teralynx/docker-saiserver-mrvl-teralynx/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name @@ -38,4 +40,9 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/platform/marvell-teralynx/docker-syncd-mrvl-teralynx-rpc/Dockerfile.j2 b/platform/marvell-teralynx/docker-syncd-mrvl-teralynx-rpc/Dockerfile.j2 index 39fe5a21e2ed..14499f01201f 100755 --- a/platform/marvell-teralynx/docker-syncd-mrvl-teralynx-rpc/Dockerfile.j2 +++ b/platform/marvell-teralynx/docker-syncd-mrvl-teralynx-rpc/Dockerfile.j2 @@ -1,15 +1,11 @@ -FROM docker-syncd-mrvl-teralynx-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} -{% from "dockers/dockerfile-macros.j2" import install_python_wheels, copy_files %} +{% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} +ARG BASE=docker-syncd-mrvl-teralynx-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive -COPY \ -{% for deb in docker_syncd_mrvl_teralynx_rpc_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor -%} -debs/ - RUN apt-get purge -y syncd ## Pre-install the fundamental packages @@ -26,18 +22,9 @@ RUN apt-get update \ libyaml-dev \ wget \ cmake \ - libqt5core5a \ - libqt5network5 \ - libboost-atomic1.74.0 \ libthrift-0.17.0 \ - libnanomsg5 \ libnanomsg-dev -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } ; \ -{% for deb in docker_syncd_mrvl_teralynx_rpc_debs.split(' ') -%} -dpkg_apt debs/{{ deb }}{{'; '}} -{%- endfor %} - RUN pip3 install cffi \ && pip3 install nnpy \ && mkdir -p /opt \ @@ -54,11 +41,21 @@ COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] {{ install_python_wheels(docker_syncd_mrvl_teralynx_rpc_whls.split(' ')) }} {% endif %} +{% if docker_syncd_mrvl_teralynx_rpc_debs.strip() -%} +# Copy built Debian packages +{{ copy_files("debs/", docker_syncd_mrvl_teralynx_rpc_debs.split(' '), "/debs/") }} +# Install built Debian packages and implicitly install their dependencies +{{ install_debian_packages(docker_syncd_mrvl_teralynx_rpc_debs.split(' ')) }} +{%- endif %} ## Clean up RUN apt-get purge -y libyaml-dev python3-dev libffi-dev libssl-dev wget cmake \ build-essential -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /root/deps +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/platform/marvell-teralynx/docker-syncd-mrvl-teralynx/Dockerfile.j2 b/platform/marvell-teralynx/docker-syncd-mrvl-teralynx/Dockerfile.j2 index 0e93cab95b3b..19f92e10fa04 100755 --- a/platform/marvell-teralynx/docker-syncd-mrvl-teralynx/Dockerfile.j2 +++ b/platform/marvell-teralynx/docker-syncd-mrvl-teralynx/Dockerfile.j2 @@ -1,5 +1,7 @@ -{% from "dockers/dockerfile-macros.j2" import install_debian_packages %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +{% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name @@ -8,13 +10,7 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update -COPY \ -{% for deb in docker_syncd_mrvl_teralynx_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor -%} -debs/ - -# Needed for Marvell Teralynx Debug Shell +# Needed for Innovium Debug Shell RUN apt-get install -y net-tools RUN apt-get install -y libjansson4 RUN apt-get install -y libyaml-dev @@ -22,10 +18,13 @@ RUN apt-get install -y binutils RUN pip3 install numpy RUN pip3 install yamlordereddictloader -RUN dpkg -i \ -{% for deb in docker_syncd_mrvl_teralynx_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor %} +{% if docker_syncd_mrvl_teralynx_debs.strip() -%} +# Copy locally-built Debian package dependencies +{{ copy_files("debs/", docker_syncd_mrvl_teralynx_debs.split(' '), "/debs/") }} + +# Install locally-built Debian packages and implicitly install their dependencies +{{ install_debian_packages(docker_syncd_mrvl_teralynx_debs.split(' ')) }} +{%- endif %} COPY ["start.sh", "/usr/bin/"] COPY ["ivm_start.sh", "/usr/bin/"] @@ -33,8 +32,9 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor/"] -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /debs +FROM $BASE +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 b/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 index a57f6bfb9852..bff219300ef9 100644 --- a/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 +++ b/platform/mellanox/docker-saiserver-mlnx/Dockerfile.j2 @@ -15,7 +15,9 @@ ## limitations under the License. ## {% from "dockers/dockerfile-macros.j2" import install_debian_packages %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name @@ -56,4 +58,9 @@ COPY ["sai_2700.xml", "/usr/share/"] RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 b/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 index a73879487765..206dfc4b4da4 100644 --- a/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 +++ b/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 @@ -15,7 +15,9 @@ ## limitations under the License. ## {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-syncd-mlnx-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-syncd-mlnx-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -95,9 +97,9 @@ RUN apt-get -y purge \ libthrift-dev \ build-essential -RUN apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 index 7b418ab8582d..e6175bcadebe 100755 --- a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 +++ b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 @@ -17,7 +17,9 @@ ## {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name @@ -59,11 +61,7 @@ RUN apt-get purge -y python-pip ## Clean up RUN apt-get purge -y \ python3-dev \ - python3-pip && \ - apt-get clean -y && \ - apt-get autoclean -y && \ - apt-get autoremove -y && \ - rm -rf /debs + python3-pip COPY ["supervisord.conf.j2", "/usr/share/sonic/templates/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] @@ -83,4 +81,9 @@ COPY ["ecmp_calculator/ecmp_calc_sdk.py", "/usr/lib/ecmp_calc"] COPY ["ecmp_calculator/packet_scheme.py", "/usr/lib/ecmp_calc"] COPY ["lib/port_utils.py", "/usr/lib"] +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/platform/vs/docker-dash-engine/Dockerfile.cleanup b/platform/vs/docker-dash-engine/Dockerfile.cleanup deleted file mode 100644 index 514bd95ae301..000000000000 --- a/platform/vs/docker-dash-engine/Dockerfile.cleanup +++ /dev/null @@ -1,11 +0,0 @@ -# Base docker build -FROM docker-dash-engine-sonic:latest - -# Copy the cache data to host -From scratch as output -COPY --from=docker-dash-engine-sonic:latest /cache.tgz cache.tgz - -# Clean up the cache data -FROM docker-dash-engine-sonic:latest as final -RUN rm /cache.tgz - diff --git a/platform/vs/docker-dash-engine/Dockerfile.j2 b/platform/vs/docker-dash-engine/Dockerfile.j2 index e1f6ff946c68..f5c6ec2ca0ad 100644 --- a/platform/vs/docker-dash-engine/Dockerfile.j2 +++ b/platform/vs/docker-dash-engine/Dockerfile.j2 @@ -1,5 +1,7 @@ -FROM p4lang/behavioral-model@sha256:ce45720e28a96a50f275c1b511cd84c2558b62f2cf7a7e506765183bc3fb2e32 -## FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=p4lang/behavioral-model@sha256:ce45720e28a96a50f275c1b511cd84c2558b62f2cf7a7e506765183bc3fb2e32 +## ARG BASE=docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -15,9 +17,10 @@ COPY ["start.sh", "/usr/bin/"] ## COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] ## COPY ["critical_processes", "/etc/supervisor/"] -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /debs +FROM $BASE + +## RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / +COPY --from=base / / ## ENTRYPOINT ["/usr/bin/supervisord"] ENTRYPOINT ["/usr/bin/start.sh"] diff --git a/platform/vs/docker-gbsyncd-vs/Dockerfile.j2 b/platform/vs/docker-gbsyncd-vs/Dockerfile.j2 index 59bafc9c920b..9e183a901df7 100644 --- a/platform/vs/docker-gbsyncd-vs/Dockerfile.j2 +++ b/platform/vs/docker-gbsyncd-vs/Dockerfile.j2 @@ -1,4 +1,7 @@ -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +{% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name @@ -16,16 +19,13 @@ RUN dpkg -i debs/libnl-3-dev_{{ LIBNL3_VERSION_SONIC }}_{{ CONFIGURED_ARCH }}.de RUN apt-get install -f -y libabsl20220623 libc-ares2 python3-six libboost-thread1.74.0 libboost-dev libboost-system-dev libboost-thread-dev libboost-filesystem1.74.0 libboost-program-options1.74.0 libboost-thread1.74.0 libnanomsg5 libpcap0.8 libthrift-0.17.0 libboost-dev libboost-filesystem-dev libboost-program-options-dev libgmp-dev libnanomsg-dev libpcap-dev libtool pkg-config libthrift-dev python3-thrift thrift-compiler libboost-iostreams1.74.0 libgc1 cpp libboost-dev libboost-all-dev libboost-graph-dev libboost-iostreams-dev libfl-dev libgc-dev libgmp-dev libbpf-dev tcpdump libelf-dev llvm clang python3-pyroute2 python3-ply python3-scapy python3-setuptools python3-thrift libthrift-0.17.0 libgrpc++1.51 libgrpc29 libprotobuf32 libboost-dev libboost-system-dev libboost-thread-dev libprotoc-dev protobuf-compiler python3-protobuf libgrpc++-dev libgrpc-dev protobuf-compiler-grpc python3-grpcio -COPY \ -{% for deb in docker_gbsyncd_vs_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor -%} -debs/ +{% if docker_gbsyncd_vs_debs.strip() -%} +# Copy built Debian packages +{{ copy_files("debs/", docker_gbsyncd_vs_debs.split(' '), "/debs/") }} -RUN dpkg -i \ -{% for deb in docker_gbsyncd_vs_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor %} +# Install built Debian packages and implicitly install their dependencies +{{ install_debian_packages(docker_gbsyncd_vs_debs.split(' ')) }} +{%- endif %} COPY ["start.sh", "/usr/bin/"] @@ -33,8 +33,9 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor/"] -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /debs +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/platform/vs/docker-sonic-vs/Dockerfile.j2 b/platform/vs/docker-sonic-vs/Dockerfile.j2 index 92ba5b06dbd1..c4e317b9fb56 100644 --- a/platform/vs/docker-sonic-vs/Dockerfile.j2 +++ b/platform/vs/docker-sonic-vs/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-swss-layer-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-swss-layer-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name @@ -165,6 +167,10 @@ COPY ["frr/zebra.conf", "/etc/frr/"] # Create /var/warmboot/teamd folder for teammgrd RUN mkdir -p /var/warmboot/teamd +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / + # Set PLATFORM and HWSKU environment variables ENV PLATFORM=x86_64-kvm_x86_64-r0 ENV HWSKU=Force10-S6000 diff --git a/platform/vs/docker-syncd-vs/Dockerfile.j2 b/platform/vs/docker-syncd-vs/Dockerfile.j2 index b23c1c234817..ccaf4cd48911 100644 --- a/platform/vs/docker-syncd-vs/Dockerfile.j2 +++ b/platform/vs/docker-syncd-vs/Dockerfile.j2 @@ -1,5 +1,7 @@ {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} -FROM docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} +ARG BASE=docker-config-engine-bookworm-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} + +FROM $BASE as base ARG docker_container_name @@ -31,8 +33,9 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor/"] -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /debs +FROM $BASE + +RUN --mount=type=bind,from=base,target=/changes-to-image rsync -axAX --no-D --exclude=/sys --exclude=resolv.conf /changes-to-image/ / +ENV DEBIAN_FRONTEND=noninteractive ENTRYPOINT ["/usr/local/bin/supervisord"] diff --git a/platform/vs/syncd-vs.mk b/platform/vs/syncd-vs.mk index 748e2a7df20d..8f157a2615e0 100644 --- a/platform/vs/syncd-vs.mk +++ b/platform/vs/syncd-vs.mk @@ -3,13 +3,6 @@ $(LIBSAIREDIS)_DEB_BUILD_PROFILES += syncd vs SYNCD_VS = syncd-vs_1.0.0_$(CONFIGURED_ARCH).deb $(SYNCD_VS)_RDEPENDS += $(LIBSAIREDIS) $(LIBSAIMETADATA) $(LIBSAIVS) -ifeq ($(BLDENV),bookworm) - $(LIBSAIREDIS)_DEB_BUILD_PROFILES += dashsai - $(LIBSAIREDIS)_DEPENDS += $(DASH_SAI) - $(SYNCD_VS)_RDEPENDS += $(DASH_SAI) -else - $(warning DASH_SAI cannot support this build environment $(BLDENV)) -endif $(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD_VS))) diff --git a/rules/config b/rules/config index 9ff97eb94d22..fe681082bb01 100644 --- a/rules/config +++ b/rules/config @@ -20,14 +20,6 @@ SONIC_CONFIG_MAKE_JOBS = $(shell nproc) # Supported format: simple, none DEFAULT_BUILD_LOG_TIMESTAMP = none -# SONIC_USE_DOCKER_BUILDKIT - use docker buildkit for build. -# If set to y SONiC build system will set environment variable DOCKER_BUILDKIT=1 -# to enable docker buildkit. -# This options will speed up docker image build time. -# NOTE: SONIC_USE_DOCKER_BUILDKIT will produce larger installable SONiC image -# because of a docker bug (more details: https://github.com/moby/moby/issues/38903) -# SONIC_USE_DOCKER_BUILDKIT = y - # SONIC_CONFIG_USE_NATIVE_DOCKERD_FOR_BUILD - use native dockerd for build. # If set to y SONiC build container will use native dockerd instead of dind for faster build. # Special handling of the docker image file names is needed to avoid conflicts with diff --git a/scripts/docker_version_control.sh b/scripts/docker_version_control.sh index 7af5173decae..549dc30f6e8e 100755 --- a/scripts/docker_version_control.sh +++ b/scripts/docker_version_control.sh @@ -16,7 +16,10 @@ mkdir -p target/versions/default . src/sonic-build-hooks/buildinfo/config/buildinfo.config -image_tag=`grep "^FROM " $DOCKERFILE | awk '{print$2}'` +image_tag=`grep "^ARG BASE=" $DOCKERFILE | cut -d= -f 2` +if [ -z $image_tag ]; then + image_tag=`grep "^FROM " $DOCKERFILE | awk '{print$2}'` +fi image_tag_noprefix=$image_tag [ -n "$DEFAULT_CONTAINER_REGISTRY" ] && image_tag_noprefix=$(echo $image_tag | sed "s#$DEFAULT_CONTAINER_REGISTRY##") image=`echo $image_tag | cut -f1 -d:` diff --git a/scripts/prepare_docker_buildinfo.sh b/scripts/prepare_docker_buildinfo.sh index 6dfd63bdd51c..d9b4d27584e7 100755 --- a/scripts/prepare_docker_buildinfo.sh +++ b/scripts/prepare_docker_buildinfo.sh @@ -32,7 +32,10 @@ mkdir -p $BUILDINFO_VERSION_PATH # Get the debian distribution from the docker base image if [ -z "$DISTRO" ]; then - DOCKER_BASE_IMAGE=$(grep "^FROM" $DOCKERFILE | head -n 1 | awk '{print $2}') + DOCKER_BASE_IMAGE=$(grep "^ARG BASE=" $DOCKERFILE | head -n 1 | awk '{print $2}' | cut -d'=' -f 2) + if [ -z "$DOCKER_BASE_IMAGE" ]; then + DOCKER_BASE_IMAGE=$(grep "^FROM" $DOCKERFILE | head -n 1 | awk '{print $2}') + fi DISTRO=$(docker run --rm --entrypoint "" $DOCKER_BASE_IMAGE cat /etc/os-release | grep VERSION_CODENAME | cut -d= -f2) if [ -z "$DISTRO" ]; then DISTRO=$(docker run --rm --entrypoint "" $DOCKER_BASE_IMAGE cat /etc/apt/sources.list | grep deb.debian.org | awk '{print $3}') @@ -58,16 +61,29 @@ ENV DISTRO='${DISTRO}' RUN pre_run_buildinfo '${IMAGENAME}' ' +DOCKERFILE_POST_SCRIPT=' +RUN post_run_buildinfo '${IMAGENAME}' +RUN post_run_cleanup '${IMAGENAME}' +' + # Add the auto-generate code if it is not added in the target Dockerfile if [ ! -f $DOCKERFILE_TARGET ] || ! grep -q "Auto-Generated for buildinfo" $DOCKERFILE_TARGET; then # Insert the docker build script before the RUN command LINE_NUMBER=$(grep -Fn -m 1 'RUN' $DOCKERFILE | cut -d: -f1) + COPY_BASE_LINE_NUMBER=$(grep -n -m 1 'FROM \$BASE$' $DOCKERFILE | cut -d: -f1) + if [ -z "$COPY_BASE_LINE_NUMBER" ]; then + COPY_BASE_LINE_NUMBER=$(grep -n -m 1 'FROM scratch$' $DOCKERFILE | cut -d: -f1) + fi TEMP_FILE=$(mktemp) - awk -v text="${DOCKERFILE_PRE_SCRIPT}" -v linenumber=$LINE_NUMBER 'NR==linenumber{print text}1' $DOCKERFILE > $TEMP_FILE - - # Append the docker build script at the end of the docker file - echo -e "\nRUN post_run_buildinfo ${IMAGENAME} " >> $TEMP_FILE - echo -e "\nRUN post_run_cleanup ${IMAGENAME} " >> $TEMP_FILE + if [ -n "$COPY_BASE_LINE_NUMBER" ]; then + awk -v prescript="${DOCKERFILE_PRE_SCRIPT}" -v linenumber=$LINE_NUMBER -v postscript="${DOCKERFILE_POST_SCRIPT}" -v copybaselinenumber=$COPY_BASE_LINE_NUMBER 'NR==copybaselinenumber{print postscript} NR==linenumber{print prescript}1' $DOCKERFILE > $TEMP_FILE + else + awk -v prescript="${DOCKERFILE_PRE_SCRIPT}" -v linenumber=$LINE_NUMBER 'NR==linenumber{print prescript}1' $DOCKERFILE > $TEMP_FILE + + # Append the docker build script at the end of the docker file + echo -e "\nRUN post_run_buildinfo ${IMAGENAME} " >> $TEMP_FILE + echo -e "\nRUN post_run_cleanup ${IMAGENAME} " >> $TEMP_FILE + fi cat $TEMP_FILE > $DOCKERFILE_TARGET rm -f $TEMP_FILE diff --git a/slave.mk b/slave.mk index 8f3864c42c97..81ce17f31e55 100644 --- a/slave.mk +++ b/slave.mk @@ -518,13 +518,6 @@ $(shell DBGOPT='$(DBGOPT)' scripts/prepare_slave_container_buildinfo.sh $(SLAVE_ endif include Makefile.cache -ifeq ($(SONIC_USE_DOCKER_BUILDKIT),y) -$(warning "Using SONIC_USE_DOCKER_BUILDKIT will produce larger installable SONiC image because of a docker bug (more details: https://github.com/moby/moby/issues/38903)") -export DOCKER_BUILDKIT=1 -else -export DOCKER_BUILDKIT=0 -endif - ############################################################################### ## Generic rules section @@ -1032,7 +1025,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_SIMPLE_DOCKER_IMAGES)) : $(TARGET_PATH)/%.g DBGOPT='$(DBGOPT)' \ scripts/prepare_docker_buildinfo.sh $* $($*.gz_PATH)/Dockerfile $(CONFIGURED_ARCH) $(TARGET_DOCKERFILE)/Dockerfile.buildinfo $(LOG) docker info $(LOG) - docker build --squash --no-cache \ + docker build --no-cache \ --build-arg http_proxy=$(HTTP_PROXY) \ --build-arg https_proxy=$(HTTPS_PROXY) \ --build-arg no_proxy=$(NO_PROXY) \ @@ -1180,7 +1173,7 @@ $(addprefix $(TARGET_PATH)/, $(DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .platform DBGOPT='$(DBGOPT)' \ scripts/prepare_docker_buildinfo.sh $* $($*.gz_PATH)/Dockerfile $(CONFIGURED_ARCH) $(LOG) docker info $(LOG) - docker build --no-cache $$( [[ "$($*.gz_SQUASH)" != n ]] && echo --squash)\ + docker build --no-cache \ --build-arg http_proxy=$(HTTP_PROXY) \ --build-arg https_proxy=$(HTTPS_PROXY) \ --build-arg no_proxy=$(NO_PROXY) \ @@ -1250,7 +1243,7 @@ $(addprefix $(TARGET_PATH)/, $(DOCKER_DBG_IMAGES)) : $(TARGET_PATH)/%-$(DBG_IMAG scripts/prepare_docker_buildinfo.sh $*-dbg $($*.gz_PATH)/Dockerfile-dbg $(CONFIGURED_ARCH) $(LOG) docker info $(LOG) docker build \ - $(if $($*.gz_DBG_DEPENDS), --squash --no-cache, --no-cache) \ + --no-cache \ --build-arg http_proxy=$(HTTP_PROXY) \ --build-arg https_proxy=$(HTTPS_PROXY) \ --build-arg no_proxy=$(NO_PROXY) \ diff --git a/src/sonic-build-hooks/scripts/post_run_cleanup b/src/sonic-build-hooks/scripts/post_run_cleanup index 934d1dea5ea3..974e4bab44e3 100755 --- a/src/sonic-build-hooks/scripts/post_run_cleanup +++ b/src/sonic-build-hooks/scripts/post_run_cleanup @@ -15,10 +15,9 @@ if [ ! -z "$(get_version_cache_option)" ]; then fi fi -apt-get -s clean -y -apt-get -s autoclean -y -apt-get -s autoremove -y -#apt-get -s autoremove -y --purge +apt-get clean -y +apt-get autoclean -y +apt-get autoremove -y --purge rm -f /var/cache/apt/archives/*.deb /var/cache/apt/*.bin if [[ ! ${IMAGENAME} =~ -slave- ]]; then @@ -26,7 +25,7 @@ if [[ ! ${IMAGENAME} =~ -slave- ]]; then fi rm -rf /sonic/target /ssh -rm -f /tmp/* +rm -rf /tmp/* rm -rf /debs /python-wheels ~/.cache find / | grep -E "__pycache__" | xargs rm -rf @@ -39,3 +38,17 @@ set_reproducible_mirrors -d # Remove the version deb preference rm -f $VERSION_DEB_PREFERENCE rm -f /etc/apt/preferences.d/01-versions-deb + +# Remove all doc files +find /usr/share/doc -depth \( -type f -o -type l \) ! -name copyright | xargs rm || true + +# Clean doc directories that are empty or only contain empty directories +while [ -n "$(find /usr/share/doc -depth -type d -empty -print -exec rmdir {} +)" ]; do :; done && \ + rm -rf \ + /usr/share/man/* \ + /usr/share/groff/* \ + /usr/share/info/* \ + /usr/share/lintian/* \ + /usr/share/linda/* \ + /var/cache/man/* \ + /usr/share/locale/*