Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dev Docker: add php extensions needed for unit testing and code coverage #41409

Merged
merged 6 commits into from
Jan 30, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 35 additions & 40 deletions tools/docker/Dockerfile.monorepo
Original file line number Diff line number Diff line change
Expand Up @@ -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
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll update the PR description. This snuck in. It's to disable the prompt to update pnpm when running jp commands. Since each container is destroyed after use, even if someone updated pnpm within the docker container, the image would still have 9.15.0.

I struggled to find documentation of this related to pnpm, but npm added it via npm/cli#1632 and pnpm claims to follow npm's update notification framework. In testing, it seemed to work. At worst, it does nothing.


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 \
Expand All @@ -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

Expand All @@ -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"]
Loading