From ad070e7019689a2d755e2a2cfad138c285ed7d92 Mon Sep 17 00:00:00 2001 From: stranger-danger-zamu <70606846+stranger-danger-zamu@users.noreply.github.com> Date: Sat, 13 Mar 2021 05:24:44 -0500 Subject: [PATCH] Multistage Dockerfile (#90) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Multistage Dockerfile * Fix final stage and improve image size + layer caching Co-authored-by: Sascha Ißbrücker --- .dockerignore | 13 ++++++++-- Dockerfile | 58 ++++++++++++++++++++++++++++++++----------- requirements.prod.txt | 6 +---- 3 files changed, 56 insertions(+), 21 deletions(-) diff --git a/.dockerignore b/.dockerignore index 02cccef..445b537 100644 --- a/.dockerignore +++ b/.dockerignore @@ -5,13 +5,22 @@ /node_modules /tmp /docs +/static +/build /.dockerignore /.gitignore -/build-*.sh /Dockerfile +/docker-compose.yml +/*.sh /*.iml -/package*.json +/*.patch +/*.md +/*.js + +# Whitelist files needed in build or prod image +!/rollup.config.js +!/bootstrap.sh # Remove development settings /siteroot/settings/dev.py diff --git a/Dockerfile b/Dockerfile index f4c3eb5..5d8c5fb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,22 +1,52 @@ -FROM python:3.7-slim-stretch - -# Install packages required for uswgi -RUN apt-get update -RUN apt-get -y install build-essential -RUN apt-get -y install mime-support - -# Install requirements and uwsgi server for running python web apps +FROM node:current-alpine AS node-build WORKDIR /etc/linkding -COPY requirements.prod.txt ./requirements.txt -RUN pip install -U pip -RUN pip install -Ur requirements.txt - -# Copy application +# install build dependencies +COPY package.json package-lock.json ./ +RUN npm install -g npm && \ + npm install +# compile JS components COPY . . +RUN npm run build + +FROM python:3.9-slim AS python-base +RUN apt-get update && apt-get -y install build-essential +WORKDIR /etc/linkding + + +FROM python-base AS python-build +# install build dependencies +COPY requirements.txt requirements.txt +RUN pip install -U pip && pip install -Ur requirements.txt +# run Django part of the build +COPY --from=node-build /etc/linkding . +RUN python manage.py compilescss && \ + python manage.py collectstatic --ignore=*.scss && \ + python manage.py compilescss --delete-files + + +FROM python-base AS prod-deps +COPY requirements.prod.txt ./requirements.txt +RUN mkdir /opt/venv && \ + python -m venv --upgrade-deps --copies /opt/venv && \ + /opt/venv/bin/pip install --upgrade pip wheel && \ + /opt/venv/bin/pip install -Ur requirements.txt + + +FROM python:3.9-slim as final +RUN apt-get update && apt-get -y install mime-support +WORKDIR /etc/linkding +# copy prod dependencies +COPY --from=prod-deps /opt/venv /opt/venv +# copy output from build stage +COPY --from=python-build /etc/linkding/static static/ +# copy application code +COPY . . # Expose uwsgi server at port 9090 EXPOSE 9090 - +# Activate virtual env +ENV VIRTUAL_ENV /opt/venv +ENV PATH /opt/venv/bin:$PATH # Run bootstrap logic RUN ["chmod", "+x", "./bootstrap.sh"] CMD ["./bootstrap.sh"] diff --git a/requirements.prod.txt b/requirements.prod.txt index 9c9952b..245ec48 100644 --- a/requirements.prod.txt +++ b/requirements.prod.txt @@ -1,9 +1,8 @@ beautifulsoup4==4.7.1 certifi==2019.6.16 chardet==3.0.4 +confusable-homoglyphs==3.2.0 Django==2.2.13 -django-appconf==1.0.3 -django-compressor==2.3 django-generate-secret-key==1.0.2 django-picklefield==2.0 django-registration==3.0.1 @@ -13,10 +12,7 @@ djangorestframework==3.11.1 idna==2.8 pyparsing==2.4.7 pytz==2019.1 -rcssmin==1.0.6 requests==2.22.0 -rjsmin==1.1.0 -six==1.12.0 soupsieve==1.9.2 sqlparse==0.3.0 urllib3==1.25.3