Move development into docker

This makes working with related services like redis much easier, and
helps start writing a production container
This commit is contained in:
Jake Howard 2022-07-28 14:42:12 +01:00
parent e87ed66a02
commit 97d786e969
Signed by: jake
GPG key ID: 57AFB45680EDD477
7 changed files with 86 additions and 13 deletions

View file

@ -0,0 +1,11 @@
{
"name": "Existing Docker Compose",
"dockerComposeFile": ["../docker/dev/docker-compose.yml"],
"service": "web",
"workspaceFolder": "/app",
"settings": {
"terminal.integrated.defaultProfile.linux": "bash",
"python.pythonPath": "/usr/local/bin/python"
},
"extensions": ["ms-python.python", "editorconfig.editorconfig"]
}

1
.dockerignore Symbolic link
View file

@ -0,0 +1 @@
.gitignore

View file

@ -40,6 +40,12 @@ pip:
- ./env/ - ./env/
expire_in: 30 mins expire_in: 30 mins
container:
image: docker:stable
stage: test
script:
- docker build -t website .
.python_test_template: &python_test_template .python_test_template: &python_test_template
image: python:3.10-slim image: python:3.10-slim
stage: test stage: test

54
Dockerfile Normal file
View file

@ -0,0 +1,54 @@
FROM node:16 as frontend
COPY package.json package-lock.json ./
RUN npm ci --no-audit --progress=false
# Compile static files
COPY ./scripts ./scripts
COPY ./static/src ./static/src
RUN npm run build
# The actual container
FROM python:3.10 as production
ENV VIRTUAL_ENV=/venv
RUN useradd website --create-home && mkdir /app $VIRTUAL_ENV && chown -R website /app $VIRTUAL_ENV
WORKDIR /app
ENV PATH=${POETRY_HOME}/bin:$VIRTUAL_ENV/bin:$PATH \
PYTHONUNBUFFERED=1
EXPOSE 8000
USER website
RUN python -m venv $VIRTUAL_ENV
COPY --chown=website requirements.txt ./
RUN pip install --upgrade pip && pip install -r requirements.txt
COPY --chown=website --from=frontend ./static/build ./static/build
COPY --chown=website ./manage.py ./manage.py
COPY --chown=website ./templates ./templates
COPY --chown=website ./website ./website
RUN SECRET_KEY=none python manage.py collectstatic --noinput --clear -v3
# Just dev stuff
FROM production as dev
# Swap user, so the following tasks can be run as root
USER root
RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - && apt-get install -y nodejs
RUN apt-get install -y postgresql-client
RUN curl -sSf https://just.systems/install.sh | bash -s -- --to /usr/bin
# Restore user
USER website
COPY --chown=website dev-requirements.txt ./
RUN pip install --upgrade pip && pip install -r dev-requirements.txt
CMD sleep infinity

View file

@ -2,5 +2,4 @@ web: ./manage.py runserver
watch-js: npm run build:js -- --watch watch-js: npm run build:js -- --watch
watch-css: npm run build:css -- --watch watch-css: npm run build:css -- --watch
watch-contrib: ./scripts/copy-npm-contrib.sh; while inotifywait -e modify ./scripts/copy-npm-contrib.sh; do ./scripts/copy-npm-contrib.sh; done watch-contrib: ./scripts/copy-npm-contrib.sh; while inotifywait -e modify ./scripts/copy-npm-contrib.sh; do ./scripts/copy-npm-contrib.sh; done
docker: docker-compose -f docker/dev/docker-compose.yml up rqworker: ./manage.py rqworker --with-scheduler
rqworker: sleep 5 && ./manage.py rqworker --with-scheduler

View file

@ -1,6 +1,17 @@
version: '3.7' version: '3.7'
services: services:
web:
build:
context: ../../
target: dev
environment:
- QUEUE_STORE_URL=redis://redis/0
- DEBUG=true
- SECRET_KEY=super-secret-key
volumes:
- ../../:/app
depends_on:
- redis
redis: redis:
image: redis:6.0 image: redis:6.0
ports:
- 127.0.0.1:6379:6379

View file

@ -1,14 +1,5 @@
set dotenv-load set dotenv-load
# Load virtualenv
export PATH := justfile_directory() + "/env/bin:" + env_var('PATH')
export PYTHONUNBUFFERED := "true"
export QUEUE_STORE_URL := "redis://localhost/0"
# Dev environment
export DEBUG := "true"
export SECRET_KEY := "super-secret-key"
# Recipes # Recipes
@default: @default:
just --list just --list