From a38b398d5d4ff5148c58c35895829c6d658a1f3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Holger=20Lo=CC=88sken?= Date: Tue, 26 May 2020 22:55:29 +0200 Subject: [PATCH 1/5] Build docker images for v5 --- .github/workflows/build_push.yml | 14 +++++-- Makefile | 38 +++++++++++++++-- alpine/Dockerfile_v5 | 72 ++++++++++++++++++++++++++++++++ alpine/entrypoint_v5.sh | 48 +++++++++++++++++++++ 4 files changed, 165 insertions(+), 7 deletions(-) create mode 100644 alpine/Dockerfile_v5 create mode 100755 alpine/entrypoint_v5.sh diff --git a/.github/workflows/build_push.yml b/.github/workflows/build_push.yml index f1b5245..114f864 100644 --- a/.github/workflows/build_push.yml +++ b/.github/workflows/build_push.yml @@ -19,16 +19,22 @@ jobs: id: vars run: echo ::set-output name=tag::$(echo ${GITHUB_REF:10}) - - name: Build image from alpine + - name: Build image from alpine - v5 + run: make build-alpine-v5 TAG="${{steps.vars.outputs.tag}}" + + - name: Push alpine-based image - v5 + run: make push-alpine-v5 TAG="${{steps.vars.outputs.tag}}" + + - name: Build image from alpine - v4 run: make build-alpine TAG="${{steps.vars.outputs.tag}}" - - name: Push alpine-based image + - name: Push alpine-based image - v4 run: make push-alpine TAG="${{steps.vars.outputs.tag}}" - - name: Build image from debian + - name: Build image from debian - v4 run: make build-debian TAG="${{steps.vars.outputs.tag}}" - - name: Push debian-based image + - name: Push debian-based image - v4 run: make push-debian TAG="${{steps.vars.outputs.tag}}" - name: Logout from DockerHub diff --git a/Makefile b/Makefile index 47b467c..eb672e1 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,9 @@ HUB_NAMESPACE="invoiceninja" # Image name IMAGE="invoiceninja" +# Check if v5 tag is passed, so that a v5 version should be built +IS_V5=$(shell echo ${TAG} | egrep ^5) + # Building docker images based on alpine. # Assigned tags: @@ -15,17 +18,43 @@ IMAGE="invoiceninja" # - :alpine- .PHONY: build-alpine build-alpine: +ifeq ($(IS_V5),) $(info Make: Building "$(TAG)" tagged images from alpine.) @docker build -t ${HUB_NAMESPACE}/${IMAGE}:alpine-${TAG} --build-arg INVOICENINJA_VERSION=${TAG} --file ./alpine/Dockerfile . - @docker tag ${HUB_NAMESPACE}/${IMAGE}:alpine-${TAG} ${HUB_NAMESPACE}/${IMAGE}:alpine + # Tag as alpine-4 + @docker tag ${HUB_NAMESPACE}/${IMAGE}:alpine-${TAG} ${HUB_NAMESPACE}/${IMAGE}:alpine-4 $(info Make: Done.) +endif .PHONY: push-alpine push-alpine: +ifeq ($(IS_V5),) $(info Make: Pushing tagged images from alpine.) @docker push ${HUB_NAMESPACE}/${IMAGE}:alpine-${TAG} @docker push ${HUB_NAMESPACE}/${IMAGE}:alpine $(info Make: Done.) +endif + +.PHONY: build-alpine-v5 +build-alpine-v5: +ifneq ($(IS_V5),) + $(info Make: Building "$(TAG)" tagged images from alpine.) + @docker build -t ${HUB_NAMESPACE}/${IMAGE}:alpine-${TAG} --build-arg INVOICENINJA_VERSION=${TAG} --file ./alpine/Dockerfile_v5 . + @docker tag ${HUB_NAMESPACE}/${IMAGE}:alpine-${TAG} ${HUB_NAMESPACE}/${IMAGE}:alpine-5 + @docker tag ${HUB_NAMESPACE}/${IMAGE}:alpine-${TAG} ${HUB_NAMESPACE}/${IMAGE}:alpine + @docker tag ${HUB_NAMESPACE}/${IMAGE}:alpine-${TAG} ${HUB_NAMESPACE}/${IMAGE}:latest + $(info Make: Done.) +endif + +.PHONY: push-alpine-v5 +push-alpine-v5: +ifneq ($(IS_V5),) + $(info Make: Pushing tagged images from alpine.) + @docker push ${HUB_NAMESPACE}/${IMAGE}:alpine-${TAG} + @docker push ${HUB_NAMESPACE}/${IMAGE}:alpine-5 + @docker push ${HUB_NAMESPACE}/${IMAGE}:alpine + @docker push ${HUB_NAMESPACE}/${IMAGE}:latest +endif # Building docker images based on debian. # Assigned tags: @@ -33,14 +62,17 @@ push-alpine: # - : .PHONY: build-debian build-debian: +ifeq ($(IS_V5),) $(info Make: Building "$(TAG)" tagged images from debian.) @docker build -t ${HUB_NAMESPACE}/${IMAGE}:${TAG} --build-arg INVOICENINJA_VERSION=${TAG} --file ./debian/Dockerfile . - @docker tag ${HUB_NAMESPACE}/${IMAGE}:${TAG} ${HUB_NAMESPACE}/${IMAGE}:latest $(info Make: Done.) +endif .PHONY: push-debian push-debian: +ifeq ($(IS_V5),) $(info Make: Pushing tagged images from debian.) @docker push ${HUB_NAMESPACE}/${IMAGE}:${TAG} @docker push ${HUB_NAMESPACE}/${IMAGE}:latest - $(info Make: Done.) \ No newline at end of file + $(info Make: Done.) +endif \ No newline at end of file diff --git a/alpine/Dockerfile_v5 b/alpine/Dockerfile_v5 new file mode 100644 index 0000000..440dbb1 --- /dev/null +++ b/alpine/Dockerfile_v5 @@ -0,0 +1,72 @@ +ARG PHP_VERSION=7.3 + +FROM php:${PHP_VERSION}-fpm-alpine + +LABEL maintainer="Samuel Laulhau , Holger Lösken " + +##### +# SYSTEM REQUIREMENT +##### +ARG INVOICENINJA_VERSION +WORKDIR /var/www/app + +COPY ./alpine/entrypoint_v5.sh /usr/local/bin/docker-entrypoint +RUN chmod +x /usr/local/bin/docker-entrypoint + +RUN set -eux; \ + apk add --no-cache \ + gmp-dev \ + libarchive-tools \ + libzip-dev + +RUN docker-php-ext-configure zip --with-libzip; \ + docker-php-ext-install -j$(nproc) \ + bcmath \ + gmp \ + mbstring \ + opcache \ + pdo \ + pdo_mysql \ + zip + +COPY ./config/php/php.ini /usr/local/etc/php/php.ini +COPY ./config/php/php-cli.ini /usr/local/etc/php/php-cli.ini + +# Separate user +ENV IN_USER=invoiceninja + +RUN addgroup -S "$IN_USER" && \ + adduser \ + --disabled-password \ + --gecos "" \ + --home "$(pwd)" \ + --ingroup "$IN_USER" \ + --no-create-home \ + "$IN_USER"; \ + addgroup "$IN_USER" www-data; \ + chown -R "$IN_USER":"$IN_USER" . + +USER $IN_USER + +# Download and install IN +ENV INVOICENINJA_VERSION="${INVOICENINJA_VERSION}" + +RUN curl -o /tmp/ninja.zip -LJ0 https://github.com/invoiceninja/invoiceninja/tarball/v$INVOICENINJA_VERSION \ + && bsdtar --strip-components=1 -C /var/www/app -xf /tmp/ninja.zip \ + && rm /tmp/ninja.zip \ + && mv /var/www/app/storage /var/www/app/docker-backup-storage \ + && mv /var/www/app/public /var/www/app/docker-backup-public \ + && mkdir -p /var/www/app/public/logo /var/www/app/storage \ + && cp /var/www/app/.env.example /var/www/app/.env \ + && cp .env.dusk.example .env.dusk.local \ + && chmod -R 755 /var/www/app/storage \ + && rm -rf /var/www/app/docs /var/www/app/tests + +# Override the environment settings from projects .env file +ENV LOG errorlog + +# Use to be mounted into nginx +VOLUME /var/www/app/public + +ENTRYPOINT ["docker-entrypoint"] +CMD ["php-fpm"] \ No newline at end of file diff --git a/alpine/entrypoint_v5.sh b/alpine/entrypoint_v5.sh new file mode 100755 index 0000000..fa35eb3 --- /dev/null +++ b/alpine/entrypoint_v5.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env sh +set -e + +# first arg is `-f` or `--some-option` +if [ "${1#-}" != "$1" ]; then + set -- php-fpm "$@" +fi + +BAK_STORAGE_PATH=/var/www/app/docker-backup-storage/ +BAK_LOGO_PATH=/var/www/app/docker-backup-public/logo/ + +if [ ! -d /var/www/app/storage ]; then + cp -Rp $BAK_STORAGE_PATH /var/www/app/storage +else + if [ -d $BAK_STORAGE_PATH]; then + IN_STORAGE_BACKUP="$(ls $BAK_STORAGE_PATH)" + for path in $IN_STORAGE_BACKUP; do + if [ ! -e "/var/www/app/storage/$path" ]; then + cp -Rp "$BAK_STORAGE_PATH/$path" "/var/www/app/storage/" + fi + done + fi +fi + +if [ ! -d /var/www/app/public/logo ] && [ -d $BAK_LOGO_PATH ]; then + cp -Rp $BAK_LOGO_PATH /var/www/app/public/logo +else + if [ -d $BAK_LOGO_PATH ]; then + IN_LOGO_BACKUP="$(ls $BAK_LOGO_PATH)" + for path in $IN_LOGO_BACKUP; do + if [ ! -e "/var/www/app/public/logo/$path" ]; then + cp -Rp "$BAK_LOGO_PATH/$path" "/var/www/app/public/logo/" + fi + done + fi +fi + +# compare public volume version with image version +if [ ! -e /var/www/app/public/version ] || [ "$INVOICENINJA_VERSION" != "$(cat /var/www/app/public/version)" ]; then + cp -au /var/www/app/docker-backup-public/* /var/www/app/public/ + echo $INVOICENINJA_VERSION > /var/www/app/public/version +fi + +# Set permission for mounted directories +chown invoiceninja:www-data /var/www/app/storage +chown invoiceninja:www-data /var/www/app/public + +exec docker-php-entrypoint "$@" From 4350619c6469b414df326eda5d3e220bcbd18762 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Holger=20Lo=CC=88sken?= Date: Tue, 26 May 2020 23:04:49 +0200 Subject: [PATCH 2/5] Update tags for v5 --- Makefile | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index eb672e1..b7373b9 100644 --- a/Makefile +++ b/Makefile @@ -39,10 +39,9 @@ endif build-alpine-v5: ifneq ($(IS_V5),) $(info Make: Building "$(TAG)" tagged images from alpine.) - @docker build -t ${HUB_NAMESPACE}/${IMAGE}:alpine-${TAG} --build-arg INVOICENINJA_VERSION=${TAG} --file ./alpine/Dockerfile_v5 . - @docker tag ${HUB_NAMESPACE}/${IMAGE}:alpine-${TAG} ${HUB_NAMESPACE}/${IMAGE}:alpine-5 - @docker tag ${HUB_NAMESPACE}/${IMAGE}:alpine-${TAG} ${HUB_NAMESPACE}/${IMAGE}:alpine - @docker tag ${HUB_NAMESPACE}/${IMAGE}:alpine-${TAG} ${HUB_NAMESPACE}/${IMAGE}:latest + @docker build -t ${HUB_NAMESPACE}/${IMAGE}:${TAG} --build-arg INVOICENINJA_VERSION=${TAG} --file ./alpine/Dockerfile_v5 . + @docker tag ${HUB_NAMESPACE}/${IMAGE}:${TAG} ${HUB_NAMESPACE}/${IMAGE}:5 + @docker tag ${HUB_NAMESPACE}/${IMAGE}:${TAG} ${HUB_NAMESPACE}/${IMAGE}:latest $(info Make: Done.) endif @@ -50,9 +49,8 @@ endif push-alpine-v5: ifneq ($(IS_V5),) $(info Make: Pushing tagged images from alpine.) - @docker push ${HUB_NAMESPACE}/${IMAGE}:alpine-${TAG} - @docker push ${HUB_NAMESPACE}/${IMAGE}:alpine-5 - @docker push ${HUB_NAMESPACE}/${IMAGE}:alpine + @docker push ${HUB_NAMESPACE}/${IMAGE}:${TAG} + @docker push ${HUB_NAMESPACE}/${IMAGE}:5 @docker push ${HUB_NAMESPACE}/${IMAGE}:latest endif From b190c8e6337a8e5b868158ce59b889bddb67481a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Holger=20Lo=CC=88sken?= Date: Wed, 27 May 2020 19:08:42 +0200 Subject: [PATCH 3/5] Built multi stage image for v5 --- alpine/Dockerfile_v5 | 91 +++++++++++++++++++++++++---------------- alpine/entrypoint_v5.sh | 8 +++- docker-compose.yml | 5 ++- 3 files changed, 66 insertions(+), 38 deletions(-) diff --git a/alpine/Dockerfile_v5 b/alpine/Dockerfile_v5 index 440dbb1..3bff415 100644 --- a/alpine/Dockerfile_v5 +++ b/alpine/Dockerfile_v5 @@ -1,68 +1,87 @@ ARG PHP_VERSION=7.3 +# Get Invoice Ninja +FROM alpine:latest as base +ARG INVOICENINJA_VERSION + +RUN set -eux; \ + apk add --no-cache \ + curl \ + libarchive-tools; \ + mkdir -p /var/www/app + +RUN curl -o /tmp/ninja.tar.gz -LJ0 https://github.com/invoiceninja/invoiceninja/tarball/v$INVOICENINJA_VERSION \ + && bsdtar --strip-components=1 -C /var/www/app -xf /tmp/ninja.tar.gz \ + && rm /tmp/ninja.tar.gz \ + && cp -R /var/www/app/storage /var/www/app/docker-backup-storage \ + && cp -R /var/www/app/public /var/www/app/docker-backup-public \ + && mkdir -p /var/www/app/public/logo /var/www/app/storage \ + && cp /var/www/app/.env.example /var/www/app/.env \ + && cp /var/www/app/.env.dusk.example /var/www/app/.env.dusk.local \ + && rm -rf /var/www/app/docs /var/www/app/tests + +# Install nodejs packages +FROM node:12-alpine as frontend + +COPY --from=base /var/www/app /var/www/app +WORKDIR /var/www/app/ + +RUN npm install + +# Prepare php image FROM php:${PHP_VERSION}-fpm-alpine +ARG INVOICENINJA_VERSION LABEL maintainer="Samuel Laulhau , Holger Lösken " -##### -# SYSTEM REQUIREMENT -##### -ARG INVOICENINJA_VERSION WORKDIR /var/www/app +COPY --from=frontend /var/www/app /var/www/app COPY ./alpine/entrypoint_v5.sh /usr/local/bin/docker-entrypoint RUN chmod +x /usr/local/bin/docker-entrypoint RUN set -eux; \ apk add --no-cache \ gmp-dev \ - libarchive-tools \ - libzip-dev - -RUN docker-php-ext-configure zip --with-libzip; \ - docker-php-ext-install -j$(nproc) \ - bcmath \ - gmp \ - mbstring \ - opcache \ - pdo \ - pdo_mysql \ - zip + libzip-dev; \ + docker-php-ext-configure zip --with-libzip; \ + docker-php-ext-install -j$(nproc) \ + bcmath \ + exif \ + gmp \ + mbstring \ + opcache \ + pdo \ + pdo_mysql \ + zip COPY ./config/php/php.ini /usr/local/etc/php/php.ini COPY ./config/php/php-cli.ini /usr/local/etc/php/php-cli.ini -# Separate user -ENV IN_USER=invoiceninja +## Separate user +ENV INVOICENINJA_USER=invoiceninja -RUN addgroup -S "$IN_USER" && \ +RUN addgroup -S "$INVOICENINJA_USER" && \ adduser \ --disabled-password \ --gecos "" \ --home "$(pwd)" \ - --ingroup "$IN_USER" \ + --ingroup "$INVOICENINJA_USER" \ --no-create-home \ - "$IN_USER"; \ - addgroup "$IN_USER" www-data; \ - chown -R "$IN_USER":"$IN_USER" . + "$INVOICENINJA_USER"; \ + addgroup "$INVOICENINJA_USER" www-data; \ + chown -R "$INVOICENINJA_USER":"$INVOICENINJA_USER" /var/www/app -USER $IN_USER +# Install Composer +RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer; \ + composer global require hirak/prestissimo; -# Download and install IN -ENV INVOICENINJA_VERSION="${INVOICENINJA_VERSION}" +USER $INVOICENINJA_USER -RUN curl -o /tmp/ninja.zip -LJ0 https://github.com/invoiceninja/invoiceninja/tarball/v$INVOICENINJA_VERSION \ - && bsdtar --strip-components=1 -C /var/www/app -xf /tmp/ninja.zip \ - && rm /tmp/ninja.zip \ - && mv /var/www/app/storage /var/www/app/docker-backup-storage \ - && mv /var/www/app/public /var/www/app/docker-backup-public \ - && mkdir -p /var/www/app/public/logo /var/www/app/storage \ - && cp /var/www/app/.env.example /var/www/app/.env \ - && cp .env.dusk.example .env.dusk.local \ - && chmod -R 755 /var/www/app/storage \ - && rm -rf /var/www/app/docs /var/www/app/tests +RUN composer install --no-dev --no-suggest --no-progress # Override the environment settings from projects .env file +ENV APP_ENV production ENV LOG errorlog # Use to be mounted into nginx diff --git a/alpine/entrypoint_v5.sh b/alpine/entrypoint_v5.sh index fa35eb3..e25fa78 100755 --- a/alpine/entrypoint_v5.sh +++ b/alpine/entrypoint_v5.sh @@ -12,7 +12,7 @@ BAK_LOGO_PATH=/var/www/app/docker-backup-public/logo/ if [ ! -d /var/www/app/storage ]; then cp -Rp $BAK_STORAGE_PATH /var/www/app/storage else - if [ -d $BAK_STORAGE_PATH]; then + if [ -d $BAK_STORAGE_PATH ]; then IN_STORAGE_BACKUP="$(ls $BAK_STORAGE_PATH)" for path in $IN_STORAGE_BACKUP; do if [ ! -e "/var/www/app/storage/$path" ]; then @@ -45,4 +45,10 @@ fi chown invoiceninja:www-data /var/www/app/storage chown invoiceninja:www-data /var/www/app/public +# Database migrations and seeding +php artisan migrate --force +php artisan db:seed --force + +php artisan optimize + exec docker-php-entrypoint "$@" diff --git a/docker-compose.yml b/docker-compose.yml index 17cc1fd..5cde5db 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -28,12 +28,15 @@ services: - invoiceninja app: - image: invoiceninja/invoiceninja:alpine + image: invoiceninja/invoiceninja:5 restart: always environment: - APP_URL=https://localhost - APP_KEY= - DB_HOST=db + - MULTI_DB_ENABLED=false + - DB_HOST1=db + - DB_DATABASE1=ninja volumes: # Configure your mounted directories, make sure the folder 'public' and 'storage' # exist, before mounting them From c5fb1ab64b6d7783d6c62dfdf3e83b308d7f3be3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Holger=20Lo=CC=88sken?= Date: Wed, 27 May 2020 19:12:58 +0200 Subject: [PATCH 4/5] Remove db host --- docker-compose.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 5cde5db..66b00b4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -33,7 +33,6 @@ services: environment: - APP_URL=https://localhost - APP_KEY= - - DB_HOST=db - MULTI_DB_ENABLED=false - DB_HOST1=db - DB_DATABASE1=ninja From 4e05229fed9b281a04cdaca1b53e9743d1632022 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Holger=20Lo=CC=88sken?= Date: Thu, 28 May 2020 10:24:50 +0200 Subject: [PATCH 5/5] Fix missing php exts, do not run migrate and seed --- alpine/Dockerfile_v5 | 6 ++++++ alpine/entrypoint_v5.sh | 4 ---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/alpine/Dockerfile_v5 b/alpine/Dockerfile_v5 index 3bff415..dd58fa3 100644 --- a/alpine/Dockerfile_v5 +++ b/alpine/Dockerfile_v5 @@ -42,14 +42,20 @@ RUN chmod +x /usr/local/bin/docker-entrypoint RUN set -eux; \ apk add --no-cache \ + freetype-dev \ gmp-dev \ + libjpeg-turbo-dev \ + libpng-dev \ libzip-dev; \ docker-php-ext-configure zip --with-libzip; \ + docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/; \ docker-php-ext-install -j$(nproc) \ bcmath \ exif \ + gd \ gmp \ mbstring \ + mysqli \ opcache \ pdo \ pdo_mysql \ diff --git a/alpine/entrypoint_v5.sh b/alpine/entrypoint_v5.sh index e25fa78..00fe18d 100755 --- a/alpine/entrypoint_v5.sh +++ b/alpine/entrypoint_v5.sh @@ -45,10 +45,6 @@ fi chown invoiceninja:www-data /var/www/app/storage chown invoiceninja:www-data /var/www/app/public -# Database migrations and seeding -php artisan migrate --force -php artisan db:seed --force - php artisan optimize exec docker-php-entrypoint "$@"