mirror of
https://github.com/invoiceninja/dockerfiles.git
synced 2026-01-30 10:47:08 +01:00
Reshuffle Dockerfile to optimise caching (#306)
* Refactor alpine folder * Rearrange Dockerfile * Updated build_push.yml for testing * Updated build_push.yml for production * Added IS_DOCKER env * Added target to build_push.yml
This commit is contained in:
82
.github/workflows/build_push.yml
vendored
82
.github/workflows/build_push.yml
vendored
@@ -1,36 +1,78 @@
|
|||||||
name: Docker images
|
name: Publish Releases to Hub
|
||||||
|
|
||||||
|
# When its time to do a release do a full cross platform build for all supported
|
||||||
|
# architectures and push all of them to Docker Hub.
|
||||||
|
# Only trigger on semver shaped tags.
|
||||||
|
# Ref: https://github.com/metcalfc/docker-action-examples/blob/main/.github/workflows/release.yml
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
tags-ignore:
|
tags-ignore:
|
||||||
- "invoiceninja-*"
|
- "invoiceninja-*"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
docker:
|
||||||
name: Build images
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Login to DockerHub
|
- name: Prepare
|
||||||
run: echo ${{ secrets.DOCKERHUB_PASSWORD }} | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin
|
id: prep
|
||||||
|
run: |
|
||||||
|
DOCKER_IMAGE=invoiceninja/invoiceninja
|
||||||
|
VERSION=edge
|
||||||
|
if [[ $GITHUB_REF == refs/tags/* ]]; then
|
||||||
|
VERSION=${GITHUB_REF#refs/tags/}
|
||||||
|
fi
|
||||||
|
TAGS="${DOCKER_IMAGE}:${VERSION}"
|
||||||
|
MAJOR="$(echo "${VERSION}" | cut -d. -f1)"
|
||||||
|
MINOR="$(echo "${VERSION}" | cut -d. -f2)"
|
||||||
|
TAGS="$TAGS,${DOCKER_IMAGE}:${MAJOR},${DOCKER_IMAGE}:${MAJOR}.${MINOR}"
|
||||||
|
if [[ $VERSION =~ ^5\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
|
||||||
|
TAGS="$TAGS,${DOCKER_IMAGE}:latest"
|
||||||
|
fi
|
||||||
|
echo ::set-output name=tags::${TAGS}
|
||||||
|
echo ::set-output name=version::${VERSION}
|
||||||
|
echo ::set-output name=major::${MAJOR}
|
||||||
|
|
||||||
- name: Get the latest tag
|
- name: Set up QEMU
|
||||||
id: vars
|
uses: docker/setup-qemu-action@v1
|
||||||
run: echo ::set-output name=tag::$(echo ${GITHUB_REF:10})
|
with:
|
||||||
|
platforms: all
|
||||||
|
|
||||||
- name: Build image from alpine - v5
|
- name: Set up Docker Buildx
|
||||||
run: make build-alpine-v5 TAG="${{steps.vars.outputs.tag}}"
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
|
||||||
- name: Push alpine-based image - v5
|
- name: Cache Docker layers
|
||||||
run: make push-alpine-v5 TAG="${{steps.vars.outputs.tag}}"
|
uses: actions/cache@v2
|
||||||
|
with:
|
||||||
|
path: /tmp/.buildx-cache
|
||||||
|
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-buildx-
|
||||||
|
|
||||||
- name: Build image from alpine - v4
|
- name: Login to DockerHub
|
||||||
run: make build-alpine TAG="${{steps.vars.outputs.tag}}"
|
if: github.event_name != 'pull_request'
|
||||||
|
uses: docker/login-action@v1
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_PASSWORD }}
|
||||||
|
|
||||||
- name: Push alpine-based image - v4
|
- name: Build and push
|
||||||
run: make push-alpine TAG="${{steps.vars.outputs.tag}}"
|
id: docker_build
|
||||||
|
uses: docker/build-push-action@v2
|
||||||
|
with:
|
||||||
|
builder: ${{ steps.buildx.outputs.name }}
|
||||||
|
context: ./
|
||||||
|
file: ./alpine/${{ steps.prep.outputs.major }}/Dockerfile
|
||||||
|
build-args: INVOICENINJA_VERSION=${{ steps.prep.outputs.version }}
|
||||||
|
target: prod
|
||||||
|
platforms: linux/amd64
|
||||||
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
|
tags: ${{ steps.prep.outputs.tags }}
|
||||||
|
cache-from: type=local,src=/tmp/.buildx-cache
|
||||||
|
cache-to: type=local,dest=/tmp/.buildx-cache
|
||||||
|
|
||||||
- name: Logout from DockerHub
|
- name: Image digest
|
||||||
run: docker logout
|
run: echo ${{ steps.docker_build.outputs.digest }}
|
||||||
|
|||||||
4
Makefile
4
Makefile
@@ -23,7 +23,7 @@ VERSION=$(shell echo ${TAG} | sed "s/-.*//")
|
|||||||
build-alpine:
|
build-alpine:
|
||||||
ifeq ($(IS_V5),)
|
ifeq ($(IS_V5),)
|
||||||
$(info Make: Building "$(VERSION)" tagged images from alpine.)
|
$(info Make: Building "$(VERSION)" tagged images from alpine.)
|
||||||
@docker build -t ${HUB_NAMESPACE}/${IMAGE}:alpine-${VERSION} --build-arg INVOICENINJA_VERSION=${VERSION} --file ./alpine/Dockerfile .
|
@docker build -t ${HUB_NAMESPACE}/${IMAGE}:alpine-${VERSION} --build-arg INVOICENINJA_VERSION=${VERSION} --file ./alpine/4/Dockerfile .
|
||||||
# Tag as alpine-4
|
# Tag as alpine-4
|
||||||
@docker tag ${HUB_NAMESPACE}/${IMAGE}:alpine-${VERSION} ${HUB_NAMESPACE}/${IMAGE}:alpine-4
|
@docker tag ${HUB_NAMESPACE}/${IMAGE}:alpine-${VERSION} ${HUB_NAMESPACE}/${IMAGE}:alpine-4
|
||||||
$(info Make: Done.)
|
$(info Make: Done.)
|
||||||
@@ -42,7 +42,7 @@ endif
|
|||||||
build-alpine-v5:
|
build-alpine-v5:
|
||||||
ifneq ($(IS_V5),)
|
ifneq ($(IS_V5),)
|
||||||
$(info Make: Building "$(VERSION)" tagged images from alpine.)
|
$(info Make: Building "$(VERSION)" tagged images from alpine.)
|
||||||
@docker build -t ${HUB_NAMESPACE}/${IMAGE}:${VERSION} --build-arg INVOICENINJA_VERSION=${VERSION} --file ./alpine/Dockerfile_v5 .
|
@docker build -t ${HUB_NAMESPACE}/${IMAGE}:${VERSION} --build-arg INVOICENINJA_VERSION=${VERSION} --file ./alpine/5/Dockerfile .
|
||||||
@docker tag ${HUB_NAMESPACE}/${IMAGE}:${VERSION} ${HUB_NAMESPACE}/${IMAGE}:5
|
@docker tag ${HUB_NAMESPACE}/${IMAGE}:${VERSION} ${HUB_NAMESPACE}/${IMAGE}:5
|
||||||
@docker tag ${HUB_NAMESPACE}/${IMAGE}:${VERSION} ${HUB_NAMESPACE}/${IMAGE}:latest
|
@docker tag ${HUB_NAMESPACE}/${IMAGE}:${VERSION} ${HUB_NAMESPACE}/${IMAGE}:latest
|
||||||
$(info Make: Done.)
|
$(info Make: Done.)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ ARG PHP_VERSION=7.2
|
|||||||
ARG BAK_STORAGE_PATH=/var/www/app/docker-backup-storage/
|
ARG BAK_STORAGE_PATH=/var/www/app/docker-backup-storage/
|
||||||
ARG BAK_PUBLIC_PATH=/var/www/app/docker-backup-public/
|
ARG BAK_PUBLIC_PATH=/var/www/app/docker-backup-public/
|
||||||
|
|
||||||
FROM php:${PHP_VERSION}-fpm-alpine
|
FROM php:${PHP_VERSION}-fpm-alpine as prod
|
||||||
|
|
||||||
LABEL maintainer="David Bomba <turbo124@gmail.com>"
|
LABEL maintainer="David Bomba <turbo124@gmail.com>"
|
||||||
|
|
||||||
@@ -63,6 +63,7 @@ RUN curl -o /tmp/ninja.zip -L https://download.invoiceninja.com/ninja-v${INVOICE
|
|||||||
&& rm -rf /var/www/app/docs /var/www/app/tests
|
&& rm -rf /var/www/app/docs /var/www/app/tests
|
||||||
|
|
||||||
# Override the environment settings from projects .env file
|
# Override the environment settings from projects .env file
|
||||||
|
ENV IS_DOCKER true
|
||||||
ENV LOG errorlog
|
ENV LOG errorlog
|
||||||
ENV SELF_UPDATER_SOURCE ''
|
ENV SELF_UPDATER_SOURCE ''
|
||||||
|
|
||||||
@@ -3,7 +3,7 @@ ARG BAK_STORAGE_PATH=/var/www/app/docker-backup-storage/
|
|||||||
ARG BAK_PUBLIC_PATH=/var/www/app/docker-backup-public/
|
ARG BAK_PUBLIC_PATH=/var/www/app/docker-backup-public/
|
||||||
|
|
||||||
# Get Invoice Ninja and install nodejs packages
|
# Get Invoice Ninja and install nodejs packages
|
||||||
FROM node:lts-alpine as frontend
|
FROM node:lts-alpine as build
|
||||||
ARG INVOICENINJA_VERSION
|
ARG INVOICENINJA_VERSION
|
||||||
ARG BAK_STORAGE_PATH
|
ARG BAK_STORAGE_PATH
|
||||||
ARG BAK_PUBLIC_PATH
|
ARG BAK_PUBLIC_PATH
|
||||||
@@ -31,19 +31,27 @@ RUN npm install --production \
|
|||||||
&& mv /var/www/app/public $BAK_PUBLIC_PATH
|
&& mv /var/www/app/public $BAK_PUBLIC_PATH
|
||||||
|
|
||||||
# Prepare php image
|
# Prepare php image
|
||||||
FROM php:${PHP_VERSION}-fpm-alpine
|
FROM php:${PHP_VERSION}-fpm-alpine as prod
|
||||||
ARG INVOICENINJA_VERSION
|
ARG INVOICENINJA_VERSION
|
||||||
ARG BAK_STORAGE_PATH
|
ARG BAK_STORAGE_PATH
|
||||||
ARG BAK_PUBLIC_PATH
|
ARG BAK_PUBLIC_PATH
|
||||||
ENV INVOICENINJA_VERSION $INVOICENINJA_VERSION
|
|
||||||
ENV BAK_STORAGE_PATH $BAK_STORAGE_PATH
|
|
||||||
ENV BAK_PUBLIC_PATH $BAK_PUBLIC_PATH
|
|
||||||
|
|
||||||
LABEL maintainer="David Bomba <turbo124@gmail.com>"
|
LABEL maintainer="David Bomba <turbo124@gmail.com>"
|
||||||
|
|
||||||
WORKDIR /var/www/app
|
WORKDIR /var/www/app
|
||||||
|
|
||||||
COPY --from=frontend /var/www/app /var/www/app
|
## Create user
|
||||||
|
ARG UID=1500
|
||||||
|
ENV INVOICENINJA_USER=invoiceninja
|
||||||
|
|
||||||
|
RUN addgroup --gid=$UID -S "$INVOICENINJA_USER" \
|
||||||
|
&& adduser --uid=$UID \
|
||||||
|
--disabled-password \
|
||||||
|
--gecos "" \
|
||||||
|
--home "$(pwd)" \
|
||||||
|
--ingroup "$INVOICENINJA_USER" \
|
||||||
|
--no-create-home \
|
||||||
|
"$INVOICENINJA_USER"
|
||||||
|
|
||||||
RUN 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
|
||||||
|
|
||||||
@@ -71,28 +79,25 @@ RUN set -eux; \
|
|||||||
chromium \
|
chromium \
|
||||||
ttf-freefont
|
ttf-freefont
|
||||||
|
|
||||||
|
# Copy files
|
||||||
COPY entrypoint.sh /usr/local/bin/docker-entrypoint
|
COPY entrypoint.sh /usr/local/bin/docker-entrypoint
|
||||||
COPY ./config/php/php.ini /usr/local/etc/php/conf.d/in-php.ini
|
COPY ./config/php/php.ini /usr/local/etc/php/conf.d/in-php.ini
|
||||||
COPY ./config/supervisor/* /
|
COPY ./config/supervisor/* /
|
||||||
|
|
||||||
## Separate user
|
# Set up app
|
||||||
ARG UID=1500
|
ENV INVOICENINJA_VERSION $INVOICENINJA_VERSION
|
||||||
ENV INVOICENINJA_USER=invoiceninja
|
ENV BAK_STORAGE_PATH $BAK_STORAGE_PATH
|
||||||
|
ENV BAK_PUBLIC_PATH $BAK_PUBLIC_PATH
|
||||||
|
COPY --from=build /var/www/app /var/www/app
|
||||||
|
|
||||||
RUN addgroup --gid=$UID -S "$INVOICENINJA_USER" \
|
RUN chmod +x /usr/local/bin/docker-entrypoint \
|
||||||
&& adduser --uid=$UID \
|
|
||||||
--disabled-password \
|
|
||||||
--gecos "" \
|
|
||||||
--home "$(pwd)" \
|
|
||||||
--ingroup "$INVOICENINJA_USER" \
|
|
||||||
--no-create-home \
|
|
||||||
"$INVOICENINJA_USER" \
|
|
||||||
&& chmod +x /usr/local/bin/docker-entrypoint \
|
|
||||||
&& chmod +x /shutdown.sh \
|
&& chmod +x /shutdown.sh \
|
||||||
&& chown -R "$INVOICENINJA_USER":"$INVOICENINJA_USER" /var/www/app
|
&& chown -R "$INVOICENINJA_USER":"$INVOICENINJA_USER" /var/www/app
|
||||||
|
|
||||||
USER $UID
|
USER $UID
|
||||||
|
|
||||||
|
# Do not remove this ENV
|
||||||
|
ENV IS_DOCKER true
|
||||||
RUN /usr/local/bin/composer install --no-dev --quiet
|
RUN /usr/local/bin/composer install --no-dev --quiet
|
||||||
|
|
||||||
# Override the environment settings from projects .env file
|
# Override the environment settings from projects .env file
|
||||||
Reference in New Issue
Block a user