Drupal Docker: Dockerfiles

Drupal Docker: Dockerfiles

2022-10-13 last update

12 minutes reading docker drupal
이것은 Docker Desktop and the VS Code devcontainer functionality 를 사용하여 Drupal 개발 환경을 설정하는 방법을 설명하는 미니 시리즈를 계속합니다. 전체 코드는 my GitHub 에서 볼 수 있습니다.

이 게시물에서는 필요한 세 가지 Dockerfile을 살펴봅니다.

마리아DB



먼저 데이터베이스용 MariaDB 컨테이너인 간단한 작업을 수행해 보겠습니다. 이것은 일반적인 공식 MariaDB 이미지를 사용하고 있으며 버전에 대해 까다롭지 않습니다. 다음은 전체 파일입니다.

# 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


PHP



이 이미지는 이 특정 호스팅 환경의 요구 사항인 Oracle Linux에서 시작합니다.

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


이 컨테이너에 직접 액세스하지 않을 것이기 때문에 여기에 실제로 필요하지 않을 수도 있지만 몇 가지 다른 유용한 유틸리티를 추가합니다.

# Install other useful packages
RUN dnf install -y curl wget zip


PHP-FPM 실행에 필요한 디렉토리를 생성합니다.

# Create required directory
RUN mkdir -p /run/php-fpm


다른 저장소(적어도 지금까지는)가 필요한 PHP 8.0을 설치합니다.

# 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


Drupal(apcu 및 uploadprogress)에서 권장하지 않는 몇 가지를 포함하여 여러 PHP 확장을 추가합니다.

# 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


PHP 디버깅 도구인 XDebug를 설치합니다.

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


성능 향상을 위해 php.ini를 몇 가지 변경합니다.

# 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


다른 클라이언트(웹 컨테이너)의 리스너를 허용하도록 php-fpm 구성을 업데이트합니다.

# 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


마지막으로 이 컨테이너에 대해 포그라운드에서 실행되는 서비스로 php-fpm을 시작합니다.

# Start PHP-FPM
ENTRYPOINT ["php-fpm"]
CMD ["-F", "-R"]


아파치



최종 컨테이너인 web은 devcontainer가 연결하고 Apache를 기본 서비스로 실행하는 기본 컨테이너입니다. 이 중 많은 부분이 PHP 컨테이너를 반복하므로 다시는 다루지 않겠습니다. 다른 점은 다음과 같습니다.

여기에는 몇 가지 더 유용한 패키지가 포함되어 있습니다.

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


https 브라우징을 위한 자체 서명된 SSL 인증서 생성을 포함하여 Apache를 구성합니다.

# 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


drupal 사용자를 추가하고 다른 권한을 변경하여 sudo 없이 직접 웹 폴더를 편집할 수 있으며 필요할 때 sudo할 수 있습니다.

# 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


Drupal 관리에 필수적인 작곡가를 설치합니다.

# 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


접근성 테스트를 위해 pa11y를 설치합니다.

# 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


이후 게시물에서 자세히 설명할 postCreateCommand 스크립트에 실행 권한을 추가합니다.

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


마지막으로 Apache를 기본 전경 프로세스로 실행합니다.

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