docs: Add chapter on upgrading, inc. system Python upgrades [#972].
[mediagoblin.git] / Dockerfile-debian-python3-sqlite
1 # A Dockerfile for MediaGoblin hacking.
2 #
3 # Most development Docker images are built and run as root. That doesn't work
4 # here because the `bower` command run within the `make` step, refuses to run as
5 # root.
6 #
7 # To build this Docker image, run:
8 #
9 # docker build -t mediagoblin-python3 -f Dockerfile-debian-python3-sqlite . # or
10 # docker build -t mediagoblin-python3 - < Dockerfile-debian-python3-sqlite # with no build context
11 #
12 # The "- < Dockerfile" format advises Docker not to include the current
13 # directory as build context.
14 #
15 # Before running the image you first need to first assign the "mediagoblin" and
16 # "user_dev" directories to an artificial group (1024) on the host that is
17 # mirrored within the image (details below):
18 #
19 # sudo chown --recursive :1024 mediagoblin user_dev
20 # find mediagoblin user_dev -type d -exec chmod 775 {} \;
21 # find mediagoblin user_dev -type f -exec chmod 664 {} \;
22 #
23 # Then you can run the image with the upstream MediaGoblin code:
24 #
25 # docker run --interactive --tty --publish 6543:6543 mediagoblin-python3
26 #
27 # Or you can run with your local "mediagoblin" and "user_dev" directories
28 # bind-mounted into the container. This provides automatic code reloading and
29 # persistence:
30 #
31 # # TODO: Not working.
32 # docker run --interactive --tty --publish 6543:6543 --volume ./mediagoblin:/opt/mediagoblin/mediagoblin --volume ./extlib:/opt/mediagoblin/extlib mediagoblin-python3
33 #
34 # Alternatively you use docker-compose instead of separate build/run steps:
35 #
36 # sudo chown --recursive :1024 mediagoblin user_dev
37 # find mediagoblin user_dev -type d -exec chmod 775 {} \;
38 # find mediagoblin user_dev -type f -exec chmod 664 {} \;
39 # docker-compose up --build
40 #
41 # You can run the test suite with:
42 #
43 # docker run --tty mediagoblin-python3 bash -c "bin/python -m pytest ./mediagoblin/tests --boxed"
44
45
46 FROM debian:buster
47
48 # Install bootstrap and configure dependencies. Currently requires virtualenv
49 # rather than the more modern python3-venv (should be fixed).
50 RUN apt-get update && apt-get install -y \
51 automake \
52 git \
53 nodejs \
54 npm \
55 python3-dev \
56 virtualenv
57
58 # Install make and runtime dependencies.
59 #
60 # Excluding python3-celery here due to conflict with dist-packges for a
61 # compatible version of billiard.
62 RUN apt-get install -y \
63 python3-alembic \
64 python3-jsonschema \
65 python3-kombu \
66 python3-lxml \
67 python3-migrate \
68 python3-py \
69 python3-pytest \
70 python3-pytest-xdist \
71 python3-six \
72 python3-snowballstemmer \
73 python3-sphinx \
74 python3-sphinxcontrib.websupport \
75 python3-webtest
76
77 # Install audio dependencies.
78 RUN apt-get install -y \
79 gstreamer1.0-libav \
80 gstreamer1.0-plugins-bad \
81 gstreamer1.0-plugins-base \
82 gstreamer1.0-plugins-good \
83 gstreamer1.0-plugins-ugly \
84 python3-gst-1.0
85
86 # Install video dependencies.
87 RUN apt-get install -y \
88 gir1.2-gst-plugins-base-1.0 \
89 gir1.2-gstreamer-1.0 \
90 gstreamer1.0-tools \
91 python3-gi
92
93 # Install document (PDF-only) dependencies.
94 # TODO: Check that PDF tests aren't skipped.
95 RUN apt-get install -y \
96 poppler-utils
97
98 # Create working directory.
99 RUN mkdir /opt/mediagoblin
100 RUN chown -R www-data:www-data /opt/mediagoblin
101 WORKDIR /opt/mediagoblin
102
103 # Create /var/www because Bower writes some cache files into /var/www during
104 # make, failing if it doesn't exist.
105 RUN mkdir --mode=g+w /var/www
106 RUN chown root:www-data /var/www
107
108 # Set up custom group to align with volume permissions for mounted
109 # "mediagoblin/mediagoblin" and "mediagoblin/user_dev".
110 #
111 # The problem here is that the host's UID, GID and mode are used in the
112 # container, but of course the container's user www-data is running under a
113 # different UID/GID so can't read or write to the volume. It seems like there
114 # should be a better approach, but we'll align volume permissions between host
115 # and container as per
116 # https://medium.com/@nielssj/docker-volumes-and-file-system-permissions-772c1aee23ca
117 RUN groupadd --system mediagoblin --gid 1024 && adduser www-data mediagoblin
118
119 USER www-data
120
121 # Copy upstream MediaGoblin into the image for use in the build process.
122 #
123 # This build process is somewhat complicated, because of Bower/NPM, translations
124 # and Python dependencies, so it's not really feasible just to copy over a
125 # requirements.txt like many Python Dockerfiles examples do. We need the full
126 # source.
127 #
128 # While it is possible to copy the source from the current directory like this:
129 #
130 # COPY --chown=www-data:www-data . /opt/mediagoblin
131 #
132 # that approach to lots of confusing problems when your working directory has
133 # changed from the default - say you've enabled some plugins or switched
134 # database type. So instead we're doing a git clone. We could potentially use
135 # `git archive` but this still wouldn't account for the submodules.
136 #
137 # TODO: Figure out a docker-only way to do the build and run from our local
138 # version, so that local changes are immediately available to the running
139 # container. Not as easy as it sounds. We have this working with docker-compose,
140 # but still uses upstream MediaGoblin for the build.
141 # RUN git clone --depth=1 git://git.savannah.gnu.org/mediagoblin.git --branch master .
142 RUN git clone --depth=1 https://gitlab.com/BenSturmfels/mediagoblin.git --branch spectrograms .
143
144 RUN ./bootstrap.sh
145 RUN VIRTUALENV_FLAGS='--system-site-packages' ./configure
146 RUN make
147
148 # Run the tests.
149 RUN ./bin/python -m pytest ./mediagoblin/tests --boxed
150
151 # Only safe if being run on a clean git checkout. Otherwise you may have already
152 # customised mediagoblin.ini to already install these.
153 RUN echo '[[mediagoblin.media_types.audio]]' >> mediagoblin.ini
154 RUN echo '[[mediagoblin.media_types.video]]' >> mediagoblin.ini
155
156 # Prepare the SQLite database.
157 #
158 # TODO: Should probably be done at runtime.
159 RUN ./bin/gmg dbupdate
160 RUN ./bin/gmg adduser --username admin --password a --email admin@example.com
161 RUN ./bin/gmg makeadmin admin
162
163 EXPOSE 6543/tcp
164
165 # TODO: Is it possible to have a CMD here that is overriden by docker-compose?
166 CMD ["./lazyserver.sh", "--server-name=broadcast"]