diff --git a/api/Dockerfile b/api/Dockerfile index f82ab3e89..92a4d7f49 100644 --- a/api/Dockerfile +++ b/api/Dockerfile @@ -1,25 +1,47 @@ -FROM python:3.6 +FROM alpine:3.8 -ENV PYTHONUNBUFFERED 1 - -# Requirements have to be pulled and installed here, otherwise caching won't work -RUN echo 'deb http://httpredir.debian.org/debian/ jessie-backports main' > /etc/apt/sources.list.d/ffmpeg.list -COPY ./requirements.apt /requirements.apt -RUN apt-get update; \ - grep "^[^#;]" requirements.apt | \ - grep -Fv "python3-dev" | \ - xargs apt-get install -y --no-install-recommends; \ - rm -rf /usr/share/doc/* /usr/share/locale/* +RUN \ + echo 'installing dependencies' && \ + apk add \ + bash \ + git \ + gettext \ + musl-dev \ + gcc \ + postgresql-dev \ + python3-dev \ + py3-psycopg2 \ + py3-pillow \ + libldap \ + ffmpeg \ + libpq \ + libmagic \ + libffi-dev \ + zlib-dev \ + openldap-dev && \ + \ + \ + ln -s /usr/bin/python3 /usr/bin/python +RUN mkdir /requirements COPY ./requirements/base.txt /requirements/base.txt -RUN pip install -r /requirements/base.txt +RUN \ + echo 'fixing requirements file for alpine' && \ + sed -i '/Pillow/d' /requirements/base.txt && \ + \ + \ + echo 'installing pip requirements' && \ + pip3 install --no-cache-dir --upgrade pip && \ + pip3 install --no-cache-dir setuptools wheel && \ + pip3 install --no-cache-dir -r /requirements/base.txt -COPY . /app - -# Since youtube-dl code is updated fairly often, we split it here -RUN pip install --upgrade youtube-dl - -WORKDIR /app +ARG install_dev_deps=0 +COPY ./requirements/*.txt /requirements/ +RUN \ + if [ "$install_dev_deps" = "1" ] ; then echo "Installing dev dependencies" && pip3 install --no-cache-dir -r /requirements/local.txt -r /requirements/test.txt ; else echo "Skipping dev deps installation" ; fi ENTRYPOINT ["./compose/django/entrypoint.sh"] CMD ["./compose/django/daphne.sh"] + +COPY . /app +WORKDIR /app diff --git a/api/compose/django/dev-entrypoint.sh b/api/compose/django/dev-entrypoint.sh index 6deeebb00..4ba161148 100755 --- a/api/compose/django/dev-entrypoint.sh +++ b/api/compose/django/dev-entrypoint.sh @@ -1,3 +1,3 @@ -#!/bin/bash +#!/bin/sh set -e exec "$@" diff --git a/api/compose/django/entrypoint.sh b/api/compose/django/entrypoint.sh index ac85f1164..3fc06a416 100755 --- a/api/compose/django/entrypoint.sh +++ b/api/compose/django/entrypoint.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh set -e # This entrypoint is used to play nicely with the current cookiecutter configuration. # Since docker-compose relies heavily on environment variables itself for configuration, we'd have to define multiple diff --git a/api/docker/Dockerfile.test b/api/docker/Dockerfile.test deleted file mode 100644 index 9e3202f92..000000000 --- a/api/docker/Dockerfile.test +++ /dev/null @@ -1,24 +0,0 @@ -FROM python:3.6 - -ENV PYTHONUNBUFFERED 1 - -# Requirements have to be pulled and installed here, otherwise caching won't work -RUN echo 'deb http://httpredir.debian.org/debian/ jessie-backports main' > /etc/apt/sources.list.d/ffmpeg.list -COPY ./requirements.apt /requirements.apt -RUN apt-get update; \ - grep "^[^#;]" requirements.apt | \ - grep -Fv "python3-dev" | \ - xargs apt-get install -y --no-install-recommends; \ - rm -rf /usr/share/doc/* /usr/share/locale/* - -RUN mkdir /requirements -COPY ./requirements/base.txt /requirements/base.txt -RUN pip install -r /requirements/base.txt -COPY ./requirements/local.txt /requirements/local.txt -RUN pip install -r /requirements/local.txt -COPY ./requirements/test.txt /requirements/test.txt -RUN pip install -r /requirements/test.txt - -COPY . /app -WORKDIR /app -ENTRYPOINT ["compose/django/dev-entrypoint.sh"] diff --git a/changes/changelog.d/alpine.enhancement b/changes/changelog.d/alpine.enhancement new file mode 100644 index 000000000..a7744a87a --- /dev/null +++ b/changes/changelog.d/alpine.enhancement @@ -0,0 +1 @@ +Based Docker image on alpine to have a smaller (and faster to build) image diff --git a/dev.yml b/dev.yml index 3eac5e635..2b1e7c5fe 100644 --- a/dev.yml +++ b/dev.yml @@ -39,36 +39,16 @@ services: networks: - internal - celeryworker: - env_file: - - .env.dev - - .env - build: - context: ./api - dockerfile: docker/Dockerfile.test - links: - - postgres - - redis - command: celery -A funkwhale_api.taskapp worker -l debug -B - environment: - - "FUNKWHALE_HOSTNAME=${FUNKWHALE_HOSTNAME-localhost}" - - "FUNKWHALE_HOSTNAME_SUFFIX=funkwhale.test" - - "FUNKWHALE_HOSTNAME_PREFIX=${COMPOSE_PROJECT_NAME}" - - "FUNKWHALE_PROTOCOL=${FUNKWHALE_PROTOCOL-http}" - - "DATABASE_URL=postgresql://postgres@postgres/postgres" - - "CACHE_URL=redis://redis:6379/0" - volumes: - - ./api:/app - - "${MUSIC_DIRECTORY_PATH-./data/music}:/music:ro" - networks: - - internal api: env_file: - .env.dev - .env - build: + build: &backend context: ./api - dockerfile: docker/Dockerfile.test + dockerfile: Dockerfile + args: + install_dev_deps: 1 + entrypoint: compose/django/dev-entrypoint.sh command: python /app/manage.py runserver 0.0.0.0:${FUNKWHALE_API_PORT-5000} volumes: - ./api:/app @@ -87,6 +67,28 @@ services: - internal cap_add: - SYS_PTRACE + + celeryworker: + env_file: + - .env.dev + - .env + build: *backend + links: + - postgres + - redis + command: celery -A funkwhale_api.taskapp worker -l debug -B + environment: + - "FUNKWHALE_HOSTNAME=${FUNKWHALE_HOSTNAME-localhost}" + - "FUNKWHALE_HOSTNAME_SUFFIX=funkwhale.test" + - "FUNKWHALE_HOSTNAME_PREFIX=${COMPOSE_PROJECT_NAME}" + - "FUNKWHALE_PROTOCOL=${FUNKWHALE_PROTOCOL-http}" + - "DATABASE_URL=postgresql://postgres@postgres/postgres" + - "CACHE_URL=redis://redis:6379/0" + volumes: + - ./api:/app + - "${MUSIC_DIRECTORY_PATH-./data/music}:/music:ro" + networks: + - internal nginx: command: /entrypoint.sh env_file: