architect/_archive/2026-04-11/standards-old/operation/operation-drupal-docker.md

version: 1.0.0
date: 2026-04-08
status: active


operation-drupal-docker

Правила работы с Drupal в Docker-контейнерах на платформе.


Структура официального образа

Официальный образ drupal:11.3-php8.3-apache основан на drupal/recommended-project.

/opt/drupal/           PROJECT ROOT (composer, vendor, drush)
├── composer.json      drupal/recommended-project scaffold
├── composer.lock
├── vendor/            все зависимости, drush БД ЗДЕСЬ
   └── bin/
       └── drush      правильный путь к drush
├── config/
   └── sync/          config_sync_directory
└── web/               WEB ROOT (Apache DocumentRoot)
    ├── core/
    ├── modules/
    └── sites/
        └── default/
            ├── settings.php
            └── files/     uploads, cache

/var/www/html  /opt/drupal/web   (симлинк)

Критично: /var/www/html — это симлинк на web root, не project root.


Drush

Правило установки

# ПРАВИЛЬНО — устанавливать в project root
cd /opt/drupal && composer require drush/drush

# НЕПРАВИЛЬНО — устанавливает в web root (не работает)
cd /var/www/html && composer require drush/drush

Правило запуска

# ПРАВИЛЬНО
/opt/drupal/vendor/bin/drush --root=/opt/drupal/web status

# НЕПРАВИЛЬНО
/var/www/html/vendor/bin/drush status

В Dockerfile

FROM drupal:11.3-php8.3-apache

RUN cd /opt/drupal && composer require drush/drush --no-interaction 2>&1 | tail -3
RUN chown -R www-data:www-data /opt/drupal/vendor

Права на папки

При монтировании volumes Docker создаёт папки от имени root. Нужно исправить.

# Обязательно при первом запуске или после пересоздания volumes
chown -R www-data:www-data /opt/drupal/web/sites/default/files
chown www-data:www-data /opt/drupal/web/sites/default/settings.php
chown -R www-data:www-data /opt/drupal/web/modules/custom
chown -R www-data:www-data /opt/drupal/web/themes/custom

settings.php

Монтирование

volumes:
  # rw — обязательно, Drupal пишет hash_salt и config_sync_directory при установке
  - ./drupal/settings.php:/var/www/html/sites/default/settings.php:rw

Никогда :ro — Drupal не сможет завершить установку.

Минимальный settings.php (до установки)

<?php
// Пустой — entrypoint создаст полный после drush site:install

После drush site:install файл будет заполнен автоматически:
- $databases — credentials
- $settings['hash_salt'] — случайная строка
- $settings['config_sync_directory'] — путь к sync

Добавить после установки

// Разрешить доступ с любого хоста (dev)
$settings['trusted_host_patterns'] = ['^.*$'];

// Или для конкретных доменов (prod)
$settings['trusted_host_patterns'] = [
  '^lideravto\.aipd\.ru$',
  '^new\.lideravto\.ru$',
];

config/sync директория

Settings.php ссылается на config_sync_directory. Она должна существовать.

# В docker-compose не монтируется — создаётся автоматически drush
# Но если нужна персистентность — mount volume:
volumes:
  - ./config/sync:/opt/drupal/config/sync

Docker Compose — паттерн

services:
  app:
    build: .          # Dockerfile с drush
    volumes:
      - drupal-files:/var/www/html/sites/default/files
      - ./drupal/settings.php:/var/www/html/sites/default/settings.php:rw
      - ./drupal/modules:/var/www/html/modules/custom:rw
      - ./drupal/themes:/var/www/html/themes/custom:rw
    environment:
      DRUPAL_DATABASE_HOST: db
      DRUPAL_DATABASE_NAME: ${MYSQL_DATABASE}
      DRUPAL_DATABASE_USERNAME: ${MYSQL_USER}
      DRUPAL_DATABASE_PASSWORD: ${MYSQL_PASSWORD}
      DRUPAL_SITE_NAME: "Мой сайт"
      DRUPAL_ADMIN_PASS: ${DRUPAL_ADMIN_PASS}
    depends_on:
      db:
        condition: service_healthy

  db:
    image: mysql:8.4
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      retries: 10

Dockerfile — шаблон

FROM drupal:11.3-php8.3-apache

# Drush в project root (не web root)
RUN cd /opt/drupal && composer require drush/drush --no-interaction 2>&1 | tail -3
RUN chown -R www-data:www-data /opt/drupal/vendor

COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod +x /usr/local/bin/docker-entrypoint.sh

ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["apache2-foreground"]

Entrypoint — авто-установка

#!/bin/bash
set -e

DRUSH=/opt/drupal/vendor/bin/drush
ROOT=/opt/drupal/web

# Проверить установлен ли Drupal (bootstrap успешен = БД с таблицами)
if ! $DRUSH --root=$ROOT status --field=bootstrap 2>/dev/null | grep -q "Successful"; then
    echo "[entrypoint] Installing Drupal..."

    $DRUSH --root=$ROOT site:install standard \
        --db-url="mysql://${DRUPAL_DATABASE_USERNAME}:${DRUPAL_DATABASE_PASSWORD}@${DRUPAL_DATABASE_HOST}:3306/${DRUPAL_DATABASE_NAME}" \
        --site-name="${DRUPAL_SITE_NAME:-Drupal}" \
        --account-name=admin \
        --account-pass="${DRUPAL_ADMIN_PASS:-Admin2026!}" \
        --locale=ru \
        --yes

    echo "[entrypoint] Drupal installed successfully"
fi

exec "$@"

Drush команды — шпаргалка

# Статус
docker exec -u www-data app-container /opt/drupal/vendor/bin/drush --root=/opt/drupal/web status

# Сбросить кеш
docker exec -u www-data app-container /opt/drupal/vendor/bin/drush --root=/opt/drupal/web cr

# Включить модуль
docker exec -u www-data app-container /opt/drupal/vendor/bin/drush --root=/opt/drupal/web en module_name -y

# Сменить пароль admin
docker exec -u www-data app-container /opt/drupal/vendor/bin/drush --root=/opt/drupal/web user:password admin "NewPass123"

# Логин-ссылка
docker exec -u www-data app-container /opt/drupal/vendor/bin/drush --root=/opt/drupal/web uli

# Запустить обновления БД
docker exec -u www-data app-container /opt/drupal/vendor/bin/drush --root=/opt/drupal/web updb -y

# Установить модуль через composer
docker exec app-container bash -c "cd /opt/drupal && composer require drupal/module_name"

Диагностика

Симптом Причина Решение
Сайт показывает install.php БД пустая Запустить entrypoint / drush site:install
sites/default/files не writable root:root вместо www-data chown -R www-data:www-data /opt/drupal/web/sites/default/files
settings.php не пишется mount :ro Изменить на :rw в docker-compose, пересоздать контейнер
drush: command not found Drush установлен в web root cd /opt/drupal && composer require drush/drush
Package drupal/core is not installed Drush в неправильном месте То же — project root, не web root
Globally installed Drush not supported То же То же
trusted_host_patterns error Домен не в белом списке Добавить в settings.php

Связанные документы

Документ Путь
Установка на Beget library/artifacts/cms/drupal2/INSTALL.md
Шаблоны стеков infra/templates/drupal/
Проект lideravto-new projects/org/lideravto-new/CLAUDE.md
Деплой сервисов architect/standards/operation/operation-services-deployment.md