11# build in root dir using:
2- # docker build -t roundup-app --rm -f Dockerfile ..
2+ #
3+ # docker build -t roundup-app --rm -f scripts/Dockerfile .
34#
45# run using:
5- # docker run --rm -v /home/rouilj/develop/roundup.sysadmin/issue.tracker:/usr/src/app/tracker -p 9017:8080 roundup-app:latest
6+ #
7+ # docker run --rm -v /.../issue.tracker:/usr/src/app/tracker \
8+ # -p 9017:8080 roundup-app:latest
69
7- FROM python:3-alpine
810
9- ENV appdir=/usr/src/app
10- WORKDIR $appdir
11+ # Global vars for all build stages
1112
12- # allow roundup install from local directory or from pypi
13+ # application directory
14+ ARG appdir=/usr/src/app
15+
16+ # support roundup install from 'local' directory or from 'pypi'
1317ARG source=local
1418
15- LABEL "org.roundup-tracker.vendor" ="Roundup Issue Tracker Team" \
16- "org.roundup-tracker.description" ="Roundup Issue Tracker using sqlite" \
17- "version" ="2.1.0 $source"
19+ FROM python:3-alpine as build
20+
21+ # Inherit global values https://github.com/moby/moby/issues/37345
22+ ARG appdir
23+
24+ WORKDIR $appdir
25+
26+ # Add packages needed to compile mysql, pgsql and other python modules.
27+ # Can't use apk to add them as that installs a 3.9 python version.
28+ # g++ installs cc1plus needed by pip install
29+ RUN apk add \
30+ g++ \
31+ gcc \
32+ gpgme-dev \
33+ linux-headers \
34+ musl-dev \
35+ mysql-dev \
36+ postgresql-dev \
37+ swig
1838
19- # add requirements for pip here, e.g. pytz or other modules
20- # ignore warnings from pip to use virtualenv
39+ # add requirements for pip here, e.g. Whoosh, gpg, zstd or other
40+ # modules not installed in the base library.
41+ # ignore warnings from pip to use virtualenv
2142COPY scripts/requirements.txt .
2243RUN pip install --no-cache-dir -r requirements.txt
2344
@@ -32,15 +53,39 @@ COPY share install/share/
3253# verify source has one of two valid values then
3354# install in python3 standard directories from local copy
3455# or install in python3 standard directories from pypi using pip
35-
36- RUN if [ "$source" == "local" ] || [ "$source" == "pypi" ]; then :; \
56+ # import from global/command line
57+ ARG source
58+ RUN set -xv && if [ "$source" = "local" ] || [ "$source" = "pypi" ]; then :; \
3759 else echo "invalid value for source: $source" ; \
3860 echo "must be local or pypi" ; exit 1; fi; \
39- if [ "$source" == "local" ]; then cd install && ./setup.py install; fi; \
40- if [ "$source" == "pypi" ]; then pip install roundup; fi
61+ if [ "$source" = "local" ]; then cd install && ./setup.py install; fi; \
62+ if [ "$source" = "pypi" ]; then pip install roundup; fi
4163
42- # delete source files
43- RUN rm -rf install
64+ # build a new smaller docker image for execution. Build image above
65+ # is 1G in size.
66+ FROM python:3-alpine
67+
68+ # import from global
69+ ARG appdir
70+
71+ WORKDIR $appdir
72+
73+ # add libraries needed to run gpg/mysql/pgsql/brotli
74+ RUN apk add \
75+ gpgme \
76+ mariadb-connector-c \
77+ libpq \
78+ libstdc++
79+
80+ ARG source
81+ LABEL "org.roundup-tracker.vendor" ="Roundup Issue Tracker Team" \
82+ "org.roundup-tracker.description" ="Roundup Issue Tracker using sqlite" \
83+ "version" ="2.1.0 $source"
84+
85+ # pull over built assets
86+ COPY --from=build /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages/
87+ COPY --from=build /usr/local/bin/roundup* /usr/local/bin/
88+ COPY --from=build /usr/local/share /usr/local/share/
4489
4590# map port 8080 to your local port
4691EXPOSE 8080/tcp
@@ -50,11 +95,12 @@ RUN mkdir tracker
5095VOLUME $appdir/tracker
5196
5297# do not run roundup as root
53- RUN adduser -D roundup
54-
55- # run the server
98+ RUN adduser -D -h /usr/src/app roundup
5699USER roundup
57- ENTRYPOINT [ "roundup-server" , "-L" , "-n" , "0.0.0.0" ]
100+
101+ # run the server, disable output buffering so we can see logs.
102+ ENV PYTHONUNBUFFERED=1
103+ ENTRYPOINT [ "roundup-server" , "-n" , "0.0.0.0" ]
58104
59105# allow the invoker to override cmd with multiple trackers
60106# in each subdirectory under $appdir/tracker. E.G.
0 commit comments