From f4f8c79ce7e6f8e16404d3d9fa5ac965d45c5270 Mon Sep 17 00:00:00 2001 From: Ween Jiann Date: Sun, 28 Mar 2021 14:18:54 +0800 Subject: [PATCH] Split docker v4 and v5 files to different directories (#310) * Move v4/5 files to separate folders * Updated github build_push.yml action * Updated docker-compose.yml --- .github/workflows/build_push.yml | 2 +- Makefile | 4 +- alpine/4/Dockerfile | 25 ++-- .../4/rootfs/etc/php/conf.d/in-php.ini | 0 .../4/rootfs/usr/local/bin/docker-entrypoint | 16 +-- alpine/4/rootfs/usr/local/bin/laravel-init.sh | 5 + alpine/5/Dockerfile | 59 +++++----- .../5/rootfs/etc}/supervisord.conf | 2 +- .../5/rootfs/usr/local/bin/docker-entrypoint | 107 ++++++++++++++++++ alpine/5/rootfs/usr/local/bin/laravel-init.sh | 5 + .../5/rootfs/usr/local/bin}/shutdown.sh | 0 .../usr/local/etc/php/conf.d/in-php.ini | 17 +++ docker-compose.yml | 4 +- 13 files changed, 182 insertions(+), 64 deletions(-) rename config/php/php.ini => alpine/4/rootfs/etc/php/conf.d/in-php.ini (100%) rename entrypoint.sh => alpine/4/rootfs/usr/local/bin/docker-entrypoint (89%) create mode 100755 alpine/4/rootfs/usr/local/bin/laravel-init.sh rename {config/supervisor => alpine/5/rootfs/etc}/supervisord.conf (97%) create mode 100755 alpine/5/rootfs/usr/local/bin/docker-entrypoint create mode 100755 alpine/5/rootfs/usr/local/bin/laravel-init.sh rename {config/supervisor => alpine/5/rootfs/usr/local/bin}/shutdown.sh (100%) mode change 100644 => 100755 create mode 100644 alpine/5/rootfs/usr/local/etc/php/conf.d/in-php.ini diff --git a/.github/workflows/build_push.yml b/.github/workflows/build_push.yml index d0031ef..0f9b319 100644 --- a/.github/workflows/build_push.yml +++ b/.github/workflows/build_push.yml @@ -64,7 +64,7 @@ jobs: uses: docker/build-push-action@v2 with: builder: ${{ steps.buildx.outputs.name }} - context: ./ + context: ./alpine/${{ steps.prep.outputs.major }}/ file: ./alpine/${{ steps.prep.outputs.major }}/Dockerfile build-args: INVOICENINJA_VERSION=${{ steps.prep.outputs.version }} target: prod diff --git a/Makefile b/Makefile index 09aa51b..92ff7f8 100644 --- a/Makefile +++ b/Makefile @@ -23,7 +23,7 @@ VERSION=$(shell echo ${TAG} | sed "s/-.*//") build-alpine: ifeq ($(IS_V5),) $(info Make: Building "$(VERSION)" tagged images from alpine.) - @docker build -t ${HUB_NAMESPACE}/${IMAGE}:alpine-${VERSION} --build-arg INVOICENINJA_VERSION=${VERSION} --file ./alpine/4/Dockerfile . + @docker build -t ${HUB_NAMESPACE}/${IMAGE}:alpine-${VERSION} --build-arg INVOICENINJA_VERSION=${VERSION} ./alpine/4/ # Tag as alpine-4 @docker tag ${HUB_NAMESPACE}/${IMAGE}:alpine-${VERSION} ${HUB_NAMESPACE}/${IMAGE}:alpine-4 $(info Make: Done.) @@ -42,7 +42,7 @@ endif build-alpine-v5: ifneq ($(IS_V5),) $(info Make: Building "$(VERSION)" tagged images from alpine.) - @docker build -t ${HUB_NAMESPACE}/${IMAGE}:${VERSION} --build-arg INVOICENINJA_VERSION=${VERSION} --file ./alpine/5/Dockerfile . + @docker build -t ${HUB_NAMESPACE}/${IMAGE}:${VERSION} --build-arg INVOICENINJA_VERSION=${VERSION} ./alpine/5/ @docker tag ${HUB_NAMESPACE}/${IMAGE}:${VERSION} ${HUB_NAMESPACE}/${IMAGE}:5 @docker tag ${HUB_NAMESPACE}/${IMAGE}:${VERSION} ${HUB_NAMESPACE}/${IMAGE}:latest $(info Make: Done.) diff --git a/alpine/4/Dockerfile b/alpine/4/Dockerfile index 3b37020..a41b45d 100644 --- a/alpine/4/Dockerfile +++ b/alpine/4/Dockerfile @@ -12,13 +12,8 @@ LABEL maintainer="David Bomba " ARG INVOICENINJA_VERSION ARG BAK_STORAGE_PATH ARG BAK_PUBLIC_PATH -ENV BAK_STORAGE_PATH $BAK_STORAGE_PATH -ENV BAK_PUBLIC_PATH $BAK_PUBLIC_PATH -WORKDIR /var/www/app -COPY entrypoint.sh /usr/local/bin/docker-entrypoint -RUN chmod +x /usr/local/bin/docker-entrypoint \ - && mv /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini +RUN mv /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini # Install PHP extensions # https://hub.docker.com/r/mlocati/php-extension-installer/tags @@ -31,26 +26,30 @@ RUN install-php-extensions \ pdo_mysql \ zip -COPY ./config/php/php.ini /usr/local/etc/php/conf.d/in-php.ini - # Separate user ENV INVOICENINJA_USER=invoiceninja -RUN addgroup --gid=1500 -S "$INVOICENINJA_USER" && \ - adduser --uid=1500 \ +WORKDIR /var/www/app + +RUN addgroup --gid=1500 -S "$INVOICENINJA_USER" \ + && adduser --uid=1500 \ --disabled-password \ --gecos "" \ --home "$(pwd)" \ --ingroup "$INVOICENINJA_USER" \ --no-create-home \ - "$INVOICENINJA_USER"; \ - addgroup "$INVOICENINJA_USER" www-data; \ - chown -R "$INVOICENINJA_USER":"$INVOICENINJA_USER" . + "$INVOICENINJA_USER" \ + && chown -R "$INVOICENINJA_USER":"$INVOICENINJA_USER" . + +COPY rootfs / +RUN chmod +x /usr/local/bin/docker-entrypoint USER 1500 # Download and install IN ENV INVOICENINJA_VERSION="${INVOICENINJA_VERSION}" +ENV BAK_STORAGE_PATH $BAK_STORAGE_PATH +ENV BAK_PUBLIC_PATH $BAK_PUBLIC_PATH RUN curl -o /tmp/ninja.zip -L https://download.invoiceninja.com/ninja-v${INVOICENINJA_VERSION}.zip \ && unzip -q /tmp/ninja.zip -d /tmp/ \ diff --git a/config/php/php.ini b/alpine/4/rootfs/etc/php/conf.d/in-php.ini similarity index 100% rename from config/php/php.ini rename to alpine/4/rootfs/etc/php/conf.d/in-php.ini diff --git a/entrypoint.sh b/alpine/4/rootfs/usr/local/bin/docker-entrypoint similarity index 89% rename from entrypoint.sh rename to alpine/4/rootfs/usr/local/bin/docker-entrypoint index 00fb316..33409fa 100755 --- a/entrypoint.sh +++ b/alpine/4/rootfs/usr/local/bin/docker-entrypoint @@ -83,9 +83,7 @@ fi rm -rf "$BAK_PUBLIC_PATH" # Set permission for web server to create/update files (only &2 + exit 1 +} + +# Indirect expansion (ie) is not supported in bourne shell. That's why we are using this "magic" here. +ie_gv() { + eval "echo \$$1" +} + +# usage: file_env VAR [DEFAULT] +# ie: file_env 'XYZ_DB_PASSWORD' 'example' +# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of +# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) +file_env() { + local var="$1" + local fileVar="${var}_FILE" + local def="${2:-}" + + if [ "$(ie_gv ${var})" != "" ] && [ "$(ie_gv ${fileVar})" != "" ]; then + in_error "Both $var and $fileVar are set (but are exclusive)" + fi + + local val="$def" + if [ "$(ie_gv ${var})" != "" ]; then + val=$(ie_gv ${var}) + elif [ "$(ie_gv ${fileVar})" != "" ]; then + val=$(cat $(ie_gv ${fileVar})) + fi + + export "$var"="$val" + unset "$fileVar" +} + +# first arg is `-f` or `--some-option` +if [ "${1#-}" != "$1" ]; then + set -- php-fpm "$@" +fi + +# create storage volume +if [ ! -d /var/www/app/storage ] && [ -d "$BAK_STORAGE_PATH" ]; then + mv "$BAK_STORAGE_PATH" /var/www/app/storage +elif [ -d "$BAK_STORAGE_PATH" ]; then + # copy missing folders in storage + 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 +rm -rf "$BAK_STORAGE_PATH" + +# create public volume +if [ ! -d /var/www/app/public ] && [ -d "$BAK_PUBLIC_PATH" ]; then + mv "$BAK_PUBLIC_PATH" /var/www/app/public +elif [ ! -e /var/www/app/public/version ] || [ "$INVOICENINJA_VERSION" != "$(cat /var/www/app/public/version)" ]; then + # version mismatch, update all + cp -au "$BAK_PUBLIC_PATH/"* /var/www/app/public + echo "$INVOICENINJA_VERSION" >/var/www/app/public/version +elif [ ! -d /var/www/app/public/logo ] && [ -d "$BAK_PUBLIC_PATH/logo" ]; then + # missing logo folder only, copy folder + cp -a "$BAK_PUBLIC_PATH/logo" /var/www/app/public/logo +elif [ -d "$BAK_PUBLIC_PATH/logo" ]; then + # copy missing folders in logo + IN_LOGO_BACKUP="$(ls "$BAK_PUBLIC_PATH/logo")" + for path in $IN_LOGO_BACKUP; do + if [ ! -e "/var/www/app/public/logo/$path" ]; then + cp -a "$BAK_PUBLIC_PATH/logo/$path" "/var/www/app/public/logo/" + fi + done +fi +rm -rf "$BAK_PUBLIC_PATH" + +# Initialize values that might be stored in a file +file_env 'APP_KEY' +file_env 'API_SECRET' +file_env 'CLOUDFLARE_API_KEY' +file_env 'DB_USERNAME' +file_env 'DB_USERNAME1' +file_env 'DB_USERNAME2' +file_env 'DB_PASSWORD' +file_env 'DB_PASSWORD1' +file_env 'DB_PASSWORD2' +file_env 'MAIL_USERNAME' +file_env 'MAIL_PASSWORD' +file_env 'MAILGUN_SECRET' +file_env 'S3_KEY' +file_env 'S3_SECRET' + +# Run Laravel stuff +if [[ "$1" == "supervisord" ]] || [[ "$1" == "php-fpm" ]]; then + echo "Initialising Laravel..." + . laravel-init.sh +fi + +exec docker-php-entrypoint "$@" diff --git a/alpine/5/rootfs/usr/local/bin/laravel-init.sh b/alpine/5/rootfs/usr/local/bin/laravel-init.sh new file mode 100755 index 0000000..5e875f2 --- /dev/null +++ b/alpine/5/rootfs/usr/local/bin/laravel-init.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +php artisan config:cache +php artisan optimize +php artisan migrate --force diff --git a/config/supervisor/shutdown.sh b/alpine/5/rootfs/usr/local/bin/shutdown.sh old mode 100644 new mode 100755 similarity index 100% rename from config/supervisor/shutdown.sh rename to alpine/5/rootfs/usr/local/bin/shutdown.sh diff --git a/alpine/5/rootfs/usr/local/etc/php/conf.d/in-php.ini b/alpine/5/rootfs/usr/local/etc/php/conf.d/in-php.ini new file mode 100644 index 0000000..1ecaf93 --- /dev/null +++ b/alpine/5/rootfs/usr/local/etc/php/conf.d/in-php.ini @@ -0,0 +1,17 @@ +; How often (in seconds) to check file timestamps for changes to the shared +; memory storage allocation. ("1" means validate once per second, but only +; once per request. "0" means always validate) +;opcache.revalidate_freq=2 +opcache.revalidate_freq=60 + +# http://symfony.com/doc/current/performance.html +; Duration of time, in seconds for which to cache realpath information for a given +; file or directory. For systems with rarely changing files, consider increasing this +; value. +; http://php.net/realpath-cache-ttl +;realpath_cache_ttl = 120 +realpath_cache_ttl = 600 + +; Maximum allowed size for uploaded files. +; http://php.net/upload-max-filesize +upload_max_filesize = 8M diff --git a/docker-compose.yml b/docker-compose.yml index fbe58fe..1412bef 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,8 +9,7 @@ services: # Vhost configuration #- ./config/caddy/Caddyfile:/etc/caddy/Caddyfiledocker-com - ./config/nginx/in-vhost.conf:/etc/nginx/conf.d/in-vhost.conf:ro - - ./docker/app/public:/var/www/app/public:rw,delegated - - ./docker/app/storage:/var/www/app/storage:rw,delegated + - ./docker/app/public:/var/www/app/public:ro depends_on: - app # Run webserver nginx on port 80 @@ -29,7 +28,6 @@ services: restart: always volumes: - ./config/hosts:/etc/hosts:ro - - ./config/shutdown.sh:/usr/local/bin/shutdown.sh - ./docker/app/public:/var/www/app/public:rw,delegated - ./docker/app/storage:/var/www/app/storage:rw,delegated depends_on: