FROM {{ DRUPAL_IMAGE }}:{{ DRUPAL_VERSION }} # ------------------------------------------------------------------- # System dependencies (mail support + MySQL client + basic tools) # ------------------------------------------------------------------- RUN apt-get update && \ apt-get install -y msmtp msmtp-mta git unzip zip less nano curl vim mariadb-client && \ rm -rf /var/lib/apt/lists/* # ------------------------------------------------------------------- # PHP extensions required by Drupal/Drush bootstrap # ------------------------------------------------------------------- RUN docker-php-ext-install -j"$(nproc)" pdo_mysql # ------------------------------------------------------------------- # Install Composer # ------------------------------------------------------------------- RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \ && php composer-setup.php --install-dir=/usr/local/bin --filename=composer \ && rm composer-setup.php ENV COMPOSER_ALLOW_SUPERUSER=1 # ------------------------------------------------------------------- # Build Drupal project with Drush + OpenID Connect # IMPORTANT: # - The Drupal base image uses /var/www/html as a symlink to {{ DRUPAL_DOCKER_HTML_PATH }} # - Therefore, the actual project root must be placed in /opt/drupal # ------------------------------------------------------------------- RUN set -eux; \ builddir="$(mktemp -d)"; \ composer create-project --no-interaction --no-ansi --no-progress drupal/recommended-project:^10 "$builddir"; \ composer --working-dir="$builddir" require -n drush/drush:^13 drupal/openid_connect:^2@beta; \ rm -rf /opt/drupal/* /opt/drupal/.[!.]* /opt/drupal/..?* 2>/dev/null || true; \ mkdir -p /opt/drupal; \ cp -a "$builddir"/. /opt/drupal/; \ rm -rf "$builddir" # ------------------------------------------------------------------- # Make vendor binaries available in PATH # ------------------------------------------------------------------- RUN ln -sf /opt/drupal/vendor/bin/drush /usr/local/bin/drush # ------------------------------------------------------------------- # PHP upload configuration # ------------------------------------------------------------------- COPY {{ DRUPAL_CONFIG_UPLOAD_REL }} $PHP_INI_DIR/conf.d/ # ------------------------------------------------------------------- # Permissions and ownership fixes # ------------------------------------------------------------------- RUN set -eux; \ # Ensure all directories are traversable chmod 755 /var /var/www /opt /opt/drupal; \ # Ensure correct ownership for Drupal files chown -R www-data:www-data /opt/drupal; \ # Apply default permissions find /opt/drupal -type d -exec chmod 755 {} +; \ find /opt/drupal -type f -exec chmod 644 {} +; \ # Ensure vendor binaries are executable if [ -d /opt/drupal/vendor/bin ]; then chmod a+rx /opt/drupal/vendor/bin/*; fi; \ if [ -f /opt/drupal/vendor/drush/drush/drush ]; then chmod a+rx /opt/drupal/vendor/drush/drush/drush; fi; \ # Ensure the docroot ({{ DRUPAL_DOCKER_HTML_PATH }}) is accessible if [ -d {{ DRUPAL_DOCKER_HTML_PATH }} ]; then \ chmod 755 {{ DRUPAL_DOCKER_HTML_PATH }}; \ find {{ DRUPAL_DOCKER_HTML_PATH }} -type d -exec chmod 755 {} +; \ fi; \ # Ensure settings.local.php exists and is owned by www-data install -o www-data -g www-data -m 640 /dev/null {{ DRUPAL_DOCKER_HTML_PATH }}/sites/default/settings.local.php # ------------------------------------------------------------------- # Runtime defaults # ------------------------------------------------------------------- USER www-data WORKDIR /var/www/html # symlink pointing to {{ DRUPAL_DOCKER_HTML_PATH }} # Ensure PATH for non-login shells includes /usr/local/bin ENV PATH="/usr/local/bin:/usr/local/sbin:/usr/sbin:/usr/bin:/sbin:/bin" # ------------------------------------------------------------------- # Build-time check (optional) # ------------------------------------------------------------------- RUN /usr/local/bin/drush --version