From 5803b94ac8cde7cf6ea67f52e77b220631fb58d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Sun, 2 Feb 2025 00:10:55 +0100 Subject: [PATCH 1/4] Improve dev/prod separation --- .dockerignore | 5 +++++ Dockerfile | 24 +++++++++++++++++++++--- docker-compose.yml | 2 +- 3 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..44b6aa47 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +node_modules/ +public/tmp +public/covers +public/media/cache +public/build diff --git a/Dockerfile b/Dockerfile index 057b215e..df34f344 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,20 +6,38 @@ RUN mkdir -p /tmp && chown -R www-data:www-data /tmp && chmod -R 777 /tmp RUN mkdir -p /var/run/ && chown -R www-data:www-data /var/run && chmod -R 777 /var/run USER www-data +FROM node:22 AS frontend + +WORKDIR /var/www/html +COPY . /var/www/html + +RUN npm install +RUN npm run build + FROM base AS prod USER root COPY . /var/www/html RUN composer install -RUN npm install -RUN npm run build -RUN chown -R www-data:www-data /var/www/html +RUN chown -R www-data:www-data /var/www/html \ + && rm -rf /var/www/html/public/build + +COPY --from=frontend /var/www/html/public/build /var/www/html/public/build USER www-data FROM base AS dev USER root + +RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y \ + wget \ + git \ + curl \ + sudo \ + vim \ + nodejs + RUN /usr/local/bin/install-php-extensions xdebug RUN echo ' \n\ diff --git a/docker-compose.yml b/docker-compose.yml index 695f0aa2..19e329f4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ services: biblioteca: image: ghcr.io/biblioverse/biblioteca-docker:2.0.2 build: - target: prod + target: dev command: ["/bin/sh", "-c" , "apache2-foreground" ] ports: - "48480:8080" # Web From 090544259286fb358323d90449f086396770f77d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Sun, 2 Feb 2025 02:09:07 +0100 Subject: [PATCH 2/4] Improve build process --- .dockerignore | 89 ++++++++++++++++++++++++++++++++++++++++++++++++--- Dockerfile | 27 ++++++++++++---- 2 files changed, 106 insertions(+), 10 deletions(-) diff --git a/.dockerignore b/.dockerignore index 44b6aa47..27442574 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,86 @@ -node_modules/ +###> symfony/framework-bundle ### +/.env.local +/.env.local.php +/.env.*.local +/config/secrets/prod/prod.decrypt.private.php +/public/bundles/ +/var/ +/.composer +/vendor/ +docker-compose.override.yml +/backups/*.sql +/public/media/cache/* +!/public/images/.gitkeep +!/public/images/librairies +/public/images/librairies/* +!/public/images/librairies/.gitkeep public/tmp -public/covers -public/media/cache -public/build +!/public/media/.gitkeep +/public/books +!/public/books/.gitkeep +/public/covers +!/public/covers/.gitkeep +/public/books/consume +!/public/books/consume/.gitkeep +/tests/coverage +!/tests/coverage/.gitkeep +###< symfony/framework-bundle ### + +###> phpunit/phpunit ### +/phpunit.xml +.phpunit.result.cache +###< phpunit/phpunit ### + +###> symfony/phpunit-bridge ### +.phpunit.result.cache +/phpunit.xml +###< symfony/phpunit-bridge ### + +###> liip/imagine-bundle ### +/public/media/cache/ +###< liip/imagine-bundle ### + +###> symfony/webpack-encore-bundle ### +/node_modules/ +/public/build/ +npm-debug.log +yarn-error.log +###< symfony/webpack-encore-bundle ### + +###> friendsofphp/php-cs-fixer ### +/.php-cs-fixer.php +/.php-cs-fixer.cache +###< friendsofphp/php-cs-fixer ### + + +# Custom docker override for https://github.com/typesense/typesense/issues/1351 +typesense/* + +# Test database +data/database.sqlite +*.pcap +.astro/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +###> php-cs-fixer/shim ### +/.php-cs-fixer.php +/.php-cs-fixer.cache +###< php-cs-fixer/shim ### + + +### Dockerignore specific +doc +Dockerfile +docker-compose.yml +docker-compose.test.yml +justfile +phpstan.neon +phpunit.xml.dist +rector.php +renovate.json +upgrade.sh +tests +.git diff --git a/Dockerfile b/Dockerfile index df34f344..d5f292cb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,25 +6,40 @@ RUN mkdir -p /tmp && chown -R www-data:www-data /tmp && chmod -R 777 /tmp RUN mkdir -p /var/run/ && chown -R www-data:www-data /var/run && chmod -R 777 /var/run USER www-data +# We install the dependencies in a separate layer as the frontend image also needs them +FROM base AS vendor +USER root + +# Copying the full context is not great for caching +# But composer install executes symfony commands that need the full context +COPY . /var/www/html/ + +RUN composer install + FROM node:22 AS frontend WORKDIR /var/www/html -COPY . /var/www/html + +# Needed for some symfony specific modules +COPY --from=vendor /var/www/html/vendor /var/www/html/vendor + +# Only copy what is needed, improves cacheability +COPY package.json package-lock.json webpack.config.js /var/www/html/ +COPY assets/ /var/www/html/assets/ RUN npm install RUN npm run build FROM base AS prod USER root -COPY . /var/www/html -RUN composer install - -RUN chown -R www-data:www-data /var/www/html \ - && rm -rf /var/www/html/public/build +COPY . /var/www/html/ +COPY --from=vendor /var/www/html/vendor /var/www/html/vendor COPY --from=frontend /var/www/html/public/build /var/www/html/public/build +RUN chown -R www-data:www-data /var/www/html + USER www-data FROM base AS dev From 80b07717dc3a088fedba1be63a5c25b02efea1f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Tue, 4 Feb 2025 22:42:45 +0100 Subject: [PATCH 3/4] Address code review comments --- Dockerfile | 16 ++++++++-------- docker-compose.yml | 1 - 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Dockerfile b/Dockerfile index d5f292cb..50ade741 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,5 @@ +ARG NODE_VERSION=22 + FROM ghcr.io/biblioverse/biblioteca-docker:2.0.2 AS base WORKDIR /var/www/html @@ -12,11 +14,11 @@ USER root # Copying the full context is not great for caching # But composer install executes symfony commands that need the full context -COPY . /var/www/html/ +COPY composer.json composer.lock /var/www/html/ -RUN composer install +RUN composer install --no-interaction --no-progress --no-dev --no-scripts --optimize-autoloader -FROM node:22 AS frontend +FROM node:${NODE_VERSION} AS frontend WORKDIR /var/www/html @@ -33,12 +35,10 @@ RUN npm run build FROM base AS prod USER root -COPY . /var/www/html/ - -COPY --from=vendor /var/www/html/vendor /var/www/html/vendor -COPY --from=frontend /var/www/html/public/build /var/www/html/public/build +COPY --chown=www-data:www-data . /var/www/html/ -RUN chown -R www-data:www-data /var/www/html +COPY --chown=www-data:www-data --from=vendor /var/www/html/vendor /var/www/html/vendor +COPY --chown=www-data:www-data --from=frontend /var/www/html/public/build /var/www/html/public/build USER www-data diff --git a/docker-compose.yml b/docker-compose.yml index 19e329f4..c38b7da5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,5 @@ services: biblioteca: - image: ghcr.io/biblioverse/biblioteca-docker:2.0.2 build: target: dev command: ["/bin/sh", "-c" , "apache2-foreground" ] From 67c342b79bb78e4fc93aa7376400bb91afc8baeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Wed, 5 Feb 2025 22:36:42 +0100 Subject: [PATCH 4/4] Add composer install after the copy of all files --- Dockerfile | 2 ++ docker-compose.yml | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 50ade741..72fb4e6d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -42,6 +42,8 @@ COPY --chown=www-data:www-data --from=frontend /var/www/html/public/build /var/w USER www-data +RUN composer install --no-interaction --no-progress --no-dev --optimize-autoloader + FROM base AS dev USER root diff --git a/docker-compose.yml b/docker-compose.yml index c38b7da5..f6f4788a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,7 +7,10 @@ services: - "48480:8080" # Web - "48181:8181" # NPM depends_on: - - db + db: + condition: service_started + typesense: + condition: service_started volumes: - .:/var/www/html - .composer:/home/.composer:cached