DEV Community

Ryan Robinson
Ryan Robinson

Posted on • Originally published at ryanrobinson.technology

Drupal Docker: The Dockerfiles

This continues a mini-series describing how I set up a Drupal development environment using Docker Desktop and the VS Code devcontainer functionality. The full code is available in my GitHub.

This post takes a look at the three Dockerfiles required:

MariaDB

Let’s do the simple one first: the MariaDB container for the database. This is using a general official MariaDB image and I’m not even being picky about version. This is the entire file:

# Use the default MariaDB image, not a specific Oracle Linux one FROM mariadb:latest # Expose the MySQL port to be accessible to the web container. EXPOSE 3306 
Enter fullscreen mode Exit fullscreen mode

PHP

This image starts from Oracle Linux, a requirement of this particular hosting environment:

FROM oraclelinux:8 USER root SHELL ["/bin/bash", "-c"] 
Enter fullscreen mode Exit fullscreen mode

It adds some other useful utilities, although they may not really be needed here since I won’t be accessing this container directly:

# Install other useful packages RUN dnf install -y curl wget zip 
Enter fullscreen mode Exit fullscreen mode

It creates a directory that is necessary for running PHP-FPM:

# Create required directory RUN mkdir -p /run/php-fpm 
Enter fullscreen mode Exit fullscreen mode

It installs PHP 8.0, which requires a different repository (at least so far):

# Install PHP 8.0, which needs a different repository RUN dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm RUN dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm RUN dnf -y module reset php RUN dnf -y module enable php:remi-8.0 RUN dnf -y install php 
Enter fullscreen mode Exit fullscreen mode

It adds several PHP extensions, including a few that are recommended by not required by Drupal (apcu and uploadprogress):

# Install PHP extensions, including PECL with APCU and UploadProgress extensions, recommended by Drupal RUN dnf install -y php-gd php-pdo php-zip php-mysqlnd gcc make php-devel php-pear php-pecl-apcu php-pecl-uploadprogress 
Enter fullscreen mode Exit fullscreen mode

It installs XDebug, the PHP debugging tool:

# Install XDebug RUN dnf install -y php-pecl-xdebug RUN touch /var/log/xdebug.log COPY /conf/xdebug.ini /etc/php.d/xdebug.ini 
Enter fullscreen mode Exit fullscreen mode

It makes several changes to php.ini to increase performance:

# Increase resources for PHP RUN sed -i "s/max_execution_time = 30/max_execution_time = 300/g" /etc/php.ini RUN sed -i "s/max_input_time = 60/max_input_time = 600/g" /etc/php.ini RUN sed -i "s/memory_limit = 128M/memory_limit = 2048M/g" /etc/php.ini RUN sed -i "s/upload_max_filesize = 2M/upload_max_filesize = 128M/g" /etc/php.ini RUN sed -i "s/post_max_size = 8M/post_max_size = 0/g" /etc/php.ini RUN sed -i "s/display_errors = Off/display_errors = On/g" /etc/php.ini RUN echo "# Increase timeout" >> /etc/httpd/conf.d/php.conf RUN echo "Timeout 1200" >> /etc/httpd/conf.d/php.conf RUN echo "ProxyTimeout 1200" >> /etc/httpd/conf.d/php.conf 
Enter fullscreen mode Exit fullscreen mode

It updates the php-fpm configuration to allow listeners from other clients (the web container):

# Update PHP-FPM configuration including allowing listeners from other clients, defining the OPCache, and listening on port 9000 RUN sed -i "s/listen.allowed_clients = 127.0.0.1/;listen.allowed_clients = 127.0.0.1/g" /etc/php-fpm.d/www.conf RUN sed -i "s/;php_value[opcache.file_cache] = \/var\/lib\/php\/opcache/php_value[opcache.file_cache] = \/var\/lib\/php\/opcache/g" /etc/php-fpm.d/www.conf RUN sed -i "s/listen = \/run\/php-fpm\/www.sock/listen = 9000/g" /etc/php-fpm.d/www.conf 
Enter fullscreen mode Exit fullscreen mode

And finally, it starts php-fpm as the service running in the foreground for this container:

# Start PHP-FPM ENTRYPOINT ["php-fpm"] CMD ["-F", "-R"] 
Enter fullscreen mode Exit fullscreen mode

Apache

The final container, web, is the main one that the devcontainer will connect to, running Apache as its main service. Much of this repeats the PHP container, so I won’t go through all that again. Here’s what’s different.

It includes a few more useful packages:

# Install other needed packages RUN dnf install -y curl wget git zip mod_ssl httpd php-gd openssl which mariadb sudo patch vim 
Enter fullscreen mode Exit fullscreen mode

It configures Apache, including creating a self-signed SSL certificate for https browsing:

# Apache configuration, including SSL certificates and logs RUN mkdir -p /etc/httpd/certs COPY /conf/openssl-config.txt /etc/httpd/certs/openssl-config.txt RUN openssl req -batch -newkey rsa:4096 -nodes -sha256 -keyout /etc/httpd/certs/local.drupal.com.key -x509 -days 3650 -out /etc/httpd/certs/local.drupal.com.crt -config /etc/httpd/certs/openssl-config.txt RUN openssl req -batch -newkey rsa:4096 -nodes -sha256 -keyout /etc/pki/tls/private/localhost.key -x509 -days 3650 -out /etc/pki/tls/certs/localhost.crt -config /etc/httpd/certs/openssl-config.txt RUN mkdir -p /var/log/local.drupal.com COPY /conf/local.drupal.com.conf /etc/httpd/conf.d/local.drupal.com.conf 
Enter fullscreen mode Exit fullscreen mode

It adds the drupal user and alters some other permissions so it can edit the web folder directly without sudo, and can sudo when necessary:

# Add drupal user within the apache group RUN useradd drupal RUN usermod -aG apache drupal # Change default permissions to 775 instead of 755, so that the drupal user can write to the web root RUN umask 0002 # Create sudo group, add drupal user to it, and allow those users to sudo without password RUN groupadd sudo RUN usermod -aG sudo drupal RUN sed -i "s/# %wheel ALL=(ALL) NOPASSWD: ALL/%sudo ALL=(ALL) NOPASSWD: ALL/g" /etc/sudoers 
Enter fullscreen mode Exit fullscreen mode

It installs composer, an essential for Drupal management:

# Install latest composer RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" RUN php composer-setup.php --install-dir /usr/bin --filename composer RUN php -r "unlink('composer-setup.php');" ENV COMPOSER_PROCESS_TIMEOUT=9999 
Enter fullscreen mode Exit fullscreen mode

It installs pa11y for accessibility testing:

# Install pa11y accessibility testing tool, including NodeJS RUN dnf install -y nodejs pango.x86_64 libXcomposite.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf2.x86_64 alsa-lib.x86_64 atk.x86_64 gtk3.x86_64 nss libdrm libgbm xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc libxshmfence RUN npm install pa11y -g --unsafe-perm=true --allow-root 
Enter fullscreen mode Exit fullscreen mode

It adds executable permissions to the postCreateCommand script which I will detail in a later post:

# Scripts for further actions to take on creation and attachment COPY ./scripts/postCreateCommand.sh /postCreateCommand.sh RUN ["chmod", "+x", "/postCreateCommand.sh"] 
Enter fullscreen mode Exit fullscreen mode

And finally, it runs Apache as its primary foreground process:

# Start Apache ENTRYPOINT ["/usr/sbin/httpd"] CMD ["-D", "FOREGROUND"] 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)