From d2f3899d10e2fc5df5e341354a387e8129f26789 Mon Sep 17 00:00:00 2001 From: Ambroise Maupate Date: Thu, 14 Nov 2024 21:05:55 +0100 Subject: [PATCH] feat: Migrate Dockerfile to multi-stage build and get rid of `roadiz/php83-fpm-alpine` base image BREAKING CHANGE: Base PHP image is now `php:8.3.13-fpm-bookworm` --- .dockerignore | 45 +-- .gitlab-ci.yml | 65 ++--- Dockerfile | 263 ++++++++++++++---- compose.override.yml.dist | 5 +- compose.yml | 99 ++++--- docker/mysql/Dockerfile | 9 - docker/nginx/Dockerfile | 4 - docker/php-fpm-alpine/Dockerfile | 40 --- docker/php-fpm-alpine/php.prod.ini | 38 --- .../php.ini => php/conf.d/php.dev.ini} | 23 +- docker/php/conf.d/php.prod.ini | 26 ++ docker/{php-fpm-alpine => php}/crontab.txt | 0 .../docker-cron-entrypoint | 2 +- .../docker-cron-entrypoint-dev | 2 +- .../docker-php-entrypoint | 8 - .../docker-php-entrypoint-dev | 0 docker/php/fpm.d/www.conf | 14 + docker/{php-fpm-alpine => php}/wait-for-it.sh | 0 docker/solr/Dockerfile | 17 -- docker/varnish/Dockerfile | 5 - 20 files changed, 349 insertions(+), 316 deletions(-) delete mode 100644 docker/mysql/Dockerfile delete mode 100644 docker/nginx/Dockerfile delete mode 100755 docker/php-fpm-alpine/Dockerfile delete mode 100644 docker/php-fpm-alpine/php.prod.ini rename docker/{php-fpm-alpine/php.ini => php/conf.d/php.dev.ini} (63%) create mode 100644 docker/php/conf.d/php.prod.ini rename docker/{php-fpm-alpine => php}/crontab.txt (100%) rename docker/{php-fpm-alpine => php}/docker-cron-entrypoint (98%) rename docker/{php-fpm-alpine => php}/docker-cron-entrypoint-dev (97%) rename docker/{php-fpm-alpine => php}/docker-php-entrypoint (83%) rename docker/{php-fpm-alpine => php}/docker-php-entrypoint-dev (100%) create mode 100644 docker/php/fpm.d/www.conf rename docker/{php-fpm-alpine => php}/wait-for-it.sh (100%) delete mode 100644 docker/solr/Dockerfile delete mode 100644 docker/varnish/Dockerfile diff --git a/.dockerignore b/.dockerignore index f652fba..6c9411e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,3 @@ -# Ignore Roadiz tools and cache for -# creating a docker image .dockerignore .DS_Store .git @@ -14,54 +12,37 @@ tests README.md Dockerfile Dockerfile.archive -compose.yml -compose.env -compose.standalone.yml -compose.override.yml -compose.override.yml.dist +compose.* +sonar-project.properties */temp* */*/temp* -docker -.vagrant -var/sessions/* -var/log/* -var/cache/* -var/secret/* +var /config/secrets/prod/prod.decrypt.private.php /config/secrets/prod/prod.encrypt.private.php -var/*.zip -var/*.sql -var/*.tar.gz *.zip *.sql *.log +*.tar *.tar.gz -themes/*/build -themes/*/node_modules -themes/*/app */*/*/node_modules files/* public/files/* */*/*/src-img */*/src-img */*.log -Vagrantfile -pimple.json +.phpcs-cache supervisord.pid project_env.sh -.phpcs-cache +.php-cs-fixer.cache +vendor +Makefile +.editorconfig +.gitignore +phpcs.* +phpstan.* +restic.* !.env -!vendor -!docker/solr/managed-schema.xml -!docker/php-fpm-alpine/crontab.txt -!docker/php-fpm-alpine/docker-php-entrypoint -!docker/php-fpm-alpine/docker-php-entrypoint-dev -!docker/php-fpm-alpine/docker-cron-entrypoint -!docker/php-fpm-alpine/docker-cron-entrypoint-dev -!docker/php-fpm-alpine/php.ini -!docker/php-fpm-alpine/php.prod.ini -!docker/php-fpm-alpine/wait-for-it.sh !public/themes/* diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 05d5e2b..7567916 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,11 +1,6 @@ -# Gitlab CI -# Replace “roadiz_skeleton” with your project slug -image: roadiz/php83-runner - stages: - test - build - - deploy - release # AutoDevOps templates for security @@ -20,6 +15,7 @@ variables: SENTRY_URL: "" roadiz_skeleton_test: + image: roadiz/php83-runner stage: test interruptible: true only: @@ -50,33 +46,8 @@ roadiz_skeleton_test: - php -d memory_limit=-1 vendor/bin/phpstan analyse -c phpstan.neon - php -d memory_limit=-1 vendor/bin/phpunit --colors=never -roadiz_skeleton_build: +roadiz_skeleton_build_develop: stage: build - interruptible: true - only: - - develop - - tags - cache: - key: ${CI_COMMIT_REF_SLUG} - paths: - - vendor/ - variables: - # temporary vars for composer scripts only - APP_ENV: prod - JWT_PASSPHRASE: changeme - APP_SECRET: changeme - artifacts: - expire_in: 1 hour - paths: - - vendor/ - # Keep themes assets to include them in docker image - - public/themes/ - - public/bundles/ - script: - - composer install --no-dev --optimize-autoloader - -roadiz_skeleton_dev_docker: - stage: deploy image: docker:git # Create a docker image only when a new tag is pushed only: @@ -87,23 +58,21 @@ roadiz_skeleton_dev_docker: DOCKER_DRIVER: overlay2 DOCKER_TLS_CERTDIR: "/certs" when: on_success - needs: ["roadiz_skeleton_build"] - dependencies: ["roadiz_skeleton_build"] script: # Connect to your Gitlab Registry - "echo \"Registry image: ${CI_REGISTRY_IMAGE} for develop\"" - "docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}" # App image build - - "docker build -t ${CI_REGISTRY_IMAGE}:develop ." + - "docker build --target=php-prod -t ${CI_REGISTRY_IMAGE}:develop ." - "docker push ${CI_REGISTRY_IMAGE}:develop" ## Solr image build - #- "docker build -t ${CI_REGISTRY_IMAGE}/solr:develop ./docker/solr" + #- "docker build --target=solr -t ${CI_REGISTRY_IMAGE}/solr:develop ." #- "docker push ${CI_REGISTRY_IMAGE}/solr:develop" # Nginx image build - - "docker build -t ${CI_REGISTRY_IMAGE}/nginx:develop -f docker/nginx/Dockerfile ." + - "docker build --target=nginx-prod -t ${CI_REGISTRY_IMAGE}/nginx:develop ." - "docker push ${CI_REGISTRY_IMAGE}/nginx:develop" # Varnish image build - - "docker build -t ${CI_REGISTRY_IMAGE}/varnish:develop ./docker/varnish" + - "docker build --target=varnish -t ${CI_REGISTRY_IMAGE}/varnish:develop ." - "docker push ${CI_REGISTRY_IMAGE}/varnish:develop" # @@ -111,8 +80,8 @@ roadiz_skeleton_dev_docker: # included. You must configure your Gitlab Runner to # support Docker-in-docker commands. # -roadiz_skeleton_docker: - stage: deploy +roadiz_skeleton_build_tag: + stage: build image: docker:git # Create a docker image only when a new tag is pushed only: @@ -123,29 +92,27 @@ roadiz_skeleton_docker: DOCKER_DRIVER: overlay2 DOCKER_TLS_CERTDIR: "/certs" when: on_success - needs: ["roadiz_skeleton_build"] - dependencies: ["roadiz_skeleton_build"] - before_script: - # Need curl for pushing release to Sentry - #- apk add curl +# before_script: +# # Need curl for pushing release to Sentry +# - apk add curl script: # Connect to your Gitlab Registry - "echo \"Registry image: ${CI_REGISTRY_IMAGE} for tag ${CI_COMMIT_TAG}\"" - "docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}" # App image build - - "docker build -t ${CI_REGISTRY_IMAGE}:latest -t ${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG} ." + - "docker build --target=php-prod -t ${CI_REGISTRY_IMAGE}:latest -t ${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG} ." - "docker push ${CI_REGISTRY_IMAGE}:latest" - "docker push ${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG}" ## Solr image build - #- "docker build -t ${CI_REGISTRY_IMAGE}/solr:latest -t ${CI_REGISTRY_IMAGE}/solr:${CI_COMMIT_TAG} ./docker/solr" + #- "docker build --target=solr -t ${CI_REGISTRY_IMAGE}/solr:latest -t ${CI_REGISTRY_IMAGE}/solr:${CI_COMMIT_TAG} ." #- "docker push ${CI_REGISTRY_IMAGE}/solr:latest" #- "docker push ${CI_REGISTRY_IMAGE}/solr:${CI_COMMIT_TAG}" # Nginx image build - - "docker build -t ${CI_REGISTRY_IMAGE}/nginx:latest -t ${CI_REGISTRY_IMAGE}/nginx:${CI_COMMIT_TAG} -f docker/nginx/Dockerfile ." + - "docker build --target=nginx-prod -t ${CI_REGISTRY_IMAGE}/nginx:latest -t ${CI_REGISTRY_IMAGE}/nginx:${CI_COMMIT_TAG} ." - "docker push ${CI_REGISTRY_IMAGE}/nginx:latest" - "docker push ${CI_REGISTRY_IMAGE}/nginx:${CI_COMMIT_TAG}" # Varnish image build - - "docker build -t ${CI_REGISTRY_IMAGE}/varnish:latest -t ${CI_REGISTRY_IMAGE}/varnish:${CI_COMMIT_TAG} ./docker/varnish" + - "docker build --target=varnish -t ${CI_REGISTRY_IMAGE}/varnish:latest -t ${CI_REGISTRY_IMAGE}/varnish:${CI_COMMIT_TAG} ." - "docker push ${CI_REGISTRY_IMAGE}/varnish:latest" - "docker push ${CI_REGISTRY_IMAGE}/varnish:${CI_COMMIT_TAG}" # Create Release on your app on Sentry @@ -158,7 +125,7 @@ create_gitlab_release: - if: $CI_COMMIT_TAG script: - echo "Running the release job." - needs: [ "roadiz_skeleton_docker" ] + needs: [ "roadiz_skeleton_build_tag" ] when: on_success release: tag_name: $CI_COMMIT_TAG diff --git a/Dockerfile b/Dockerfile index 89d7d8d..6aa1bca 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,69 +1,234 @@ -FROM roadiz/php83-fpm-alpine:latest +ARG PHP_VERSION=8.3.13 +ARG USER_UID=1000 + +####### +# PHP # +####### + +FROM php:${PHP_VERSION}-fpm-bookworm AS php + LABEL org.opencontainers.image.authors="ambroise@rezo-zero.com" -ARG USER_UID=1000 -ENV APP_ENV=prod -ENV APP_RUNTIME_ENV=prod -ENV APP_DEBUG=0 +ARG USER_UID + +ARG COMPOSER_VERSION=2.8.1 +ARG PHP_EXTENSION_INSTALLER_VERSION=2.6.0 +ARG PHP_EXTENSION_REDIS_VERSION=6.1.0 + +SHELL ["/bin/bash", "-e", "-o", "pipefail", "-c"] + ENV APP_FFMPEG_PATH=/usr/bin/ffmpeg ENV MYSQL_HOST=db ENV MYSQL_PORT=3306 HEALTHCHECK --start-period=30s --interval=1m --timeout=6s CMD bin/console monitor:health -q -# Added ffmpeg to extract video files thumbnails -RUN apk add --no-cache ffmpeg +COPY --link docker/php/crontab.txt /crontab.txt +COPY --link docker/php/wait-for-it.sh /wait-for-it.sh +COPY --link docker/php/fpm.d/www.conf ${PHP_INI_DIR}-fpm.d/zz-www.conf + +RUN < /etc/sudoers.d/www-data + +/usr/bin/crontab -u www-data /crontab.txt +chmod +x /wait-for-it.sh +chown -R www-data:www-data /var/www/html + +# Php extensions +curl -sSLf https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions \ + --output /usr/local/bin/install-php-extensions +chmod +x /usr/local/bin/install-php-extensions +install-php-extensions \ + @composer-${COMPOSER_VERSION} \ + amqp \ + bcmath \ + exif \ + fileinfo \ + gd \ + gmp \ + iconv \ + intl \ + json \ + mbstring \ + opcache \ + openssl \ + pcntl \ + pdo_mysql \ + simplexml \ + soap \ + xsl \ + zip \ + redis-${PHP_EXTENSION_REDIS_VERSION} +EOF + +WORKDIR /var/www/html + +################### +# PHP Development # +################### -RUN usermod -u ${USER_UID} www-data \ - && groupmod -g ${USER_UID} www-data +FROM php AS php-dev + +ENV APP_ENV=dev +ENV APP_RUNTIME_ENV=dev +ENV APP_DEBUG=1 + +# Configs +RUN ln -sf ${PHP_INI_DIR}/php.ini-development ${PHP_INI_DIR}/php.ini +COPY --link docker/php/conf.d/php.dev.ini ${PHP_INI_DIR}/conf.d/zz-app.ini +COPY --link --chmod=755 docker/php/docker-php-entrypoint-dev /usr/local/bin/docker-php-entrypoint +COPY --link --chmod=755 docker/php/docker-cron-entrypoint-dev /usr/local/bin/docker-cron-entrypoint + +RUN <