From 42477b9d6bccd8aa041df8a7181177f17e562acd Mon Sep 17 00:00:00 2001 From: Brandon Kraft Date: Thu, 30 Jan 2025 15:12:39 -0600 Subject: [PATCH] Dev Docker: add php extensions needed for unit testing and code coverage (#41409) * Add additional ext needed for WordPress [unit testing] and code coverage * Other additions from 41057 originally * condense the build steps in attempt to make building more reliable * Move pnpm_home declaration to avoid docker build warning * Update needed packages * Re-allow rec packages --- tools/docker/Dockerfile.monorepo | 75 +++++++++++++++----------------- 1 file changed, 35 insertions(+), 40 deletions(-) diff --git a/tools/docker/Dockerfile.monorepo b/tools/docker/Dockerfile.monorepo index 9638c4b32a2ba..d0a87fa9f6718 100644 --- a/tools/docker/Dockerfile.monorepo +++ b/tools/docker/Dockerfile.monorepo @@ -6,30 +6,34 @@ ARG COMPOSER_VERSION ARG NODE_VERSION ARG PNPM_VERSION +ARG DEBIAN_FRONTEND=noninteractive + ENV LANG=en_US.UTF-8 \ LC_ALL=en_US.UTF-8 \ - JETPACK_MONOREPO_ENV=1 + JETPACK_MONOREPO_ENV=1 \ + PNPM_HOME=/usr/local/pnpm \ + PATH="/usr/local/pnpm:${PATH}" \ + npm_config_update_notifier=false WORKDIR /app -# Install basic packages and PHP +# Combine all repository setup, package installation, and cleanup into one layer RUN --mount=type=cache,target=/var/lib/apt/lists/,sharing=private \ - export DEBIAN_FRONTEND=noninteractive \ - && apt-get update \ - && apt-get install -y curl gpg language-pack-en-base ca-certificates \ - # Install software-properties-common without recommended packages to avoid Python issues - && apt-get install -y --no-install-recommends software-properties-common \ + # Setup repositories and keys + apt-get update && apt-get install -y curl gpg language-pack-en-base ca-certificates \ + software-properties-common \ && add-apt-repository ppa:ondrej/php \ && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ # Add Docker's official GPG key && install -m 0755 -d /etc/apt/keyrings \ && curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc \ && chmod a+r /etc/apt/keyrings/docker.asc \ - # Add Docker repository - && echo \ - "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ - $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ - tee /etc/apt/sources.list.d/docker.list > /dev/null \ + # Add repositories + && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ + $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null \ + && N=${NODE_VERSION%%.*} \ + && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$N.x nodistro main" > /etc/apt/sources.list.d/nodesource.list \ + # Install all packages && apt-get update \ && apt-get --purge install -y \ git \ @@ -41,35 +45,37 @@ RUN --mount=type=cache,target=/var/lib/apt/lists/,sharing=private \ jq \ "php${PHP_VERSION}" \ "php${PHP_VERSION}-ast" \ + "php${PHP_VERSION}-bcmath" \ "php${PHP_VERSION}-cli" \ "php${PHP_VERSION}-curl" \ "php${PHP_VERSION}-dom" \ + "php${PHP_VERSION}-gd" \ + "php${PHP_VERSION}-igbinary" \ + "php${PHP_VERSION}-imagick" \ + "php${PHP_VERSION}-intl" \ "php${PHP_VERSION}-mbstring" \ + "php${PHP_VERSION}-mysqli" \ + "php${PHP_VERSION}-pcov" \ "php${PHP_VERSION}-xml" \ "php${PHP_VERSION}-zip" \ rsync \ + locales \ + "nodejs$(apt-cache show nodejs | sed -n "/^Version: ${NODE_VERSION}-/ { s/^Version: /=/p; q }" )" \ + # Cleanup && apt-get remove --purge -y python3-apt \ && apt-get remove --purge --auto-remove -y gpg software-properties-common \ - && apt-get clean \ - && find /var/ -name '*-old' -delete && rm -rf /var/log/dpkg.log /var/log/alternatives.log /var/log/apt/ ~/.launchpadlib + && find /var/ -name '*-old' -delete \ + && rm -rf /var/log/dpkg.log /var/log/alternatives.log /var/log/apt/ ~/.launchpadlib # Install Composer RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \ && php composer-setup.php --install-dir=/usr/local/bin --filename=composer --version=$COMPOSER_VERSION \ && php -r "unlink('composer-setup.php');" -# Install Node.js -RUN --mount=type=cache,target=/var/lib/apt/lists/,sharing=private \ - export DEBIAN_FRONTEND=noninteractive \ - && N=${NODE_VERSION%%.*} \ - && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$N.x nodistro main" > /etc/apt/sources.list.d/nodesource.list \ - && apt-get -q update \ - && VER="$(apt-cache show nodejs | sed -n "/^Version: ${NODE_VERSION}-/ { s/^Version: /=/p; q }" )" \ - && apt-get install -y nodejs$VER \ - && apt-get clean \ - && find /var/ -name '*-old' -delete && rm -rf /var/log/dpkg.log /var/log/alternatives.log /var/log/apt/ ~/.launchpadlib +# Set up PNPM global directory +RUN mkdir -p "${PNPM_HOME}" \ + && chmod 777 "${PNPM_HOME}" -# Install pnpm RUN npm install --global pnpm@$PNPM_VERSION \ && SHELL=/bin/bash pnpm setup @@ -79,22 +85,11 @@ WORKDIR /workspace COPY bin/monorepo-entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/monorepo-entrypoint.sh -# Set up locale properly -RUN apt-get update && apt-get install -y locales \ - && locale-gen en_US.UTF-8 \ +# Set up locale +RUN locale-gen en_US.UTF-8 \ && update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 \ - && apt-get clean \ - && find /var/ -name '*-old' -delete && rm -rf /var/log/dpkg.log /var/log/alternatives.log /var/log/apt/ ~/.launchpadlib - -ENV LANG=en_US.UTF-8 -ENV LC_ALL=en_US.UTF-8 - -# Set up PNPM global directory -ENV PNPM_HOME=/usr/local/pnpm -ENV PATH="${PNPM_HOME}:${PATH}" - -RUN mkdir -p "$PNPM_HOME" \ - && chmod 777 "$PNPM_HOME" + && find /var/ -name '*-old' -delete \ + && rm -rf /var/log/dpkg.log /var/log/alternatives.log /var/log/apt/ ~/.launchpadlib ENTRYPOINT ["/usr/local/bin/monorepo-entrypoint.sh"] CMD ["bash"]