# Installer image FROM mcr.microsoft.com/azurelinux/base/core:3.0 AS installer RUN tdnf install -y \ gawk \ shadow-utils \ && tdnf clean all # Install .NET's dependencies into a staging location RUN mkdir /staging \ && tdnf install -y --releasever=3.0 --installroot /staging \ prebuilt-ca-certificates \ \ # .NET dependencies glibc \ libgcc \ libstdc++ \ openssl-libs \ && tdnf clean all --releasever=3.0 --installroot /staging # Generate RPM manifest file by appending to the original manifest file from base distroless image COPY --from=mcr.microsoft.com/azurelinux/distroless/minimal:3.0 /var/lib/rpmmanifest/container-manifest-2 /tmp/rpmmanifest RUN tmpManifestPath="/tmp/rpmmanifest" \ && rpm --query --all --queryformat "%{NAME}\t%{VERSION}-%{RELEASE}\t%{INSTALLTIME}\t%{BUILDTIME}\t%{VENDOR}\t%{EPOCH}\t%{SIZE}\t%{ARCH}\t%{EPOCHNUM}\t%{SOURCERPM}\n" --root /staging | grep -v gpg-pubkey >> $tmpManifestPath \ && mkdir --parents /staging/var/lib/rpmmanifest \ # Remove duplicates that match on the first field (package name) && tac $tmpManifestPath | gawk '!x[$1]++' | sort > /staging/var/lib/rpmmanifest/container-manifest-2 # Create a non-root user and group RUN groupadd \ --gid=1654 \ app \ && useradd --no-log-init \ --uid=1654 \ --gid=1654 \ --shell /bin/false \ --create-home \ app \ && install --directory --mode 0755 --owner 1654 --group 1654 "/staging/home/app" \ && rootOrAppRegex='^\(root\|app\):' \ && cat /etc/passwd | grep $rootOrAppRegex > "/staging/etc/passwd" \ && cat /etc/group | grep $rootOrAppRegex > "/staging/etc/group" # Clean up staging RUN rm -rf \ /staging/etc/tdnf \ /staging/run/* \ /staging/var/cache/tdnf \ /staging/var/lib/rpm \ /staging/usr/share/doc \ /staging/usr/share/man \ && find /staging/var/log -type f -size +0 -delete # .NET runtime-deps image FROM mcr.microsoft.com/azurelinux/distroless/minimal:3.0 ENV \ # UID of the non-root user 'app' APP_UID=1654 \ # Configure web servers to bind to port 8080 when present ASPNETCORE_HTTP_PORTS=8080 \ # Enable detection of running in a container DOTNET_RUNNING_IN_CONTAINER=true \ # Set the invariant mode since ICU package isn't included (see https://github.com/dotnet/announcements/issues/20) DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=true COPY --from=installer /staging/ / # Workaround for https://github.com/moby/moby/issues/38710 COPY --from=installer --chown=1654:1654 /staging/home/app /home/app USER $APP_UID