forked from open-formulieren/open-forms
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDockerfile
131 lines (104 loc) · 3.55 KB
/
Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# This is a multi-stage build file, which means a stage is used to build
# the backend (dependencies), the frontend stack and a final production
# stage re-using assets from the build stages. This keeps the final production
# image minimal in size.
# Stage 1 - Backend build environment
# includes compilers and build tooling to create the environment
FROM python:3.8-slim-buster AS backend-build
RUN apt-get update && apt-get install -y --no-install-recommends \
pkg-config \
build-essential \
git \
libpq-dev \
libxml2-dev \
libxmlsec1-dev \
libxmlsec1-openssl \
# weasyprint deps
libcairo2 \
libpango-1.0-0 \
libpangocairo-1.0-0 \
libgdk-pixbuf2.0-0 \
libffi-dev \
shared-mime-info \
&& rm -rf /var/lib/apt/lists/*
# build-essential python3-dev python3-pip python3-setuptools python3-wheel python3-cffi
WORKDIR /app
RUN mkdir /app/src
# Ensure we use the latest version of pip
RUN pip install pip -U
COPY ./requirements /app/requirements
RUN pip install -r requirements/setuptools.txt
RUN pip install -r requirements/production.txt
# Stage 2 - Install frontend deps and build assets
FROM node:15-buster AS frontend-build
RUN apt-get update && apt-get install -y --no-install-recommends \
git \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
# copy configuration/build files
COPY ./build /app/build/
COPY ./*.json ./*.js ./.babelrc /app/
# install WITH dev tooling
RUN npm ci
# copy source code
COPY ./src /app/src
# build frontend
RUN npm run build
# Stage 3 - Build docker image suitable for production
FROM python:3.8-slim-buster
# Stage 3.1 - Set up the needed production dependencies
# install all the dependencies for GeoDjango
RUN apt-get update && apt-get install -y --no-install-recommends \
procps \
vim \
mime-support \
postgresql-client \
libxmlsec1 \
libxmlsec1-openssl \
gettext \
# lxml deps
# libxslt \
# weasyprint deps
libcairo2 \
libpango-1.0-0 \
libpangocairo-1.0-0 \
libgdk-pixbuf2.0-0 \
shared-mime-info \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY ./bin/docker_start.sh /start.sh
COPY ./bin/celery_worker.sh /celery_worker.sh
COPY ./bin/celery_beat.sh /celery_beat.sh
COPY ./bin/celery_flower.sh /celery_flower.sh
RUN mkdir /app/log
RUN mkdir /app/media
RUN mkdir /app/private_media
# copy backend build deps
COPY --from=backend-build /usr/local/lib/python3.8 /usr/local/lib/python3.8
COPY --from=backend-build /usr/local/bin/uwsgi /usr/local/bin/uwsgi
COPY --from=backend-build /usr/local/bin/celery /usr/local/bin/celery
COPY --from=backend-build /app/src/ /app/src/
# copy frontend build statics
COPY --from=frontend-build /app/src/openforms/static /app/src/openforms/static
COPY --from=frontend-build /app/node_modules/formiojs/dist/fonts /app/node_modules/formiojs/dist/fonts
# Include SDK files
COPY --from=openformulieren/open-forms-sdk:latest /sdk /app/static/sdk
# copy source code
COPY ./src /app/src
RUN chgrp -R 0 /app && \
chmod -R g=u /app
VOLUME /app/media /app/private_media /app/log
# RUN useradd -M -u 1000 maykin
# RUN chown -R maykin /app
# drop privileges
# USER maykin
ARG COMMIT_HASH
ENV GIT_SHA=${COMMIT_HASH}
ENV DJANGO_SETTINGS_MODULE=openforms.conf.docker
ARG SECRET_KEY=dummy
# Run collectstatic and compilemessages, so the result is already included in
# the image
RUN python src/manage.py collectstatic --noinput \
&& python src/manage.py compilemessages
EXPOSE 8000
CMD ["/start.sh"]