From aa502eadb41d36fb02365807a5f40d07b38edcac Mon Sep 17 00:00:00 2001
From: Oliver Walters <oliver.henry.walters@gmail.com>
Date: Tue, 11 Feb 2025 05:31:47 +0000
Subject: [PATCH] Separate Dockerfile for devcontainer

- Debian based (python3.11-bookworm)
- Install essential system packages
---
 .devcontainer/Dockerfile             | 30 ++++++++++++++++++++++++++++
 .devcontainer/docker-compose.yml     |  6 +-----
 .devcontainer/postCreateCommand.sh   | 10 +++++++++-
 contrib/container/Dockerfile         |  3 +--
 contrib/container/docker-compose.yml |  2 +-
 docs/mkdocs.yml                      |  2 +-
 6 files changed, 43 insertions(+), 10 deletions(-)
 create mode 100644 .devcontainer/Dockerfile

diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
new file mode 100644
index 0000000000..a87b82dc8c
--- /dev/null
+++ b/.devcontainer/Dockerfile
@@ -0,0 +1,30 @@
+# Dockerfile for the InvenTree devcontainer
+
+# In contrast with the "production" image (which is based on an Alpine image)
+# we use a Debian-based image for the devcontainer
+
+FROM mcr.microsoft.com/devcontainers/python:3.11-bookworm
+
+# InvenTree paths
+ENV INVENTREE_HOME="/home/inventree"
+ENV INVENTREE_DATA_DIR="${INVENTREE_HOME}/dev"
+ENV INVENTREE_STATIC_ROOT="${INVENTREE_DATA_DIR}/static"
+ENV INVENTREE_MEDIA_ROOT="${INVENTREE_DATA_DIR}/media"
+ENV INVENTREE_BACKUP_DIR="${INVENTREE_DATA_DIR}/backup"
+ENV INVENTREE_PLUGIN_DIR="${INVENTREE_DATA_DIR}/plugins"
+
+ENV INVENTREE_DOCKER="true"
+
+COPY contrib/container/init.sh ./
+RUN chmod +x init.sh
+
+# Install required base packages
+RUN apt update && apt install -y \
+   python3.11-dev python3.11-venv \
+   libldap2-dev libsasl2-dev \
+   libpango1.0-0 libcairo2 \
+   weasyprint
+
+# Install python database connectors
+
+ENTRYPOINT ["/bin/bash", "./init.sh"]
diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml
index 49d5201eec..51c4b1e7b9 100644
--- a/.devcontainer/docker-compose.yml
+++ b/.devcontainer/docker-compose.yml
@@ -20,11 +20,7 @@ services:
   inventree:
     build:
       context: ..
-      dockerfile: ../InvenTree/contrib/container/Dockerfile
-      target: dev
-      args:
-        base_image: "mcr.microsoft.com/vscode/devcontainers/base:alpine-3.18"
-        data_dir: "dev"
+      dockerfile: .devcontainer/Dockerfile
     volumes:
       - ../:/home/inventree:z
 
diff --git a/.devcontainer/postCreateCommand.sh b/.devcontainer/postCreateCommand.sh
index 3da203dddf..54d0e30005 100755
--- a/.devcontainer/postCreateCommand.sh
+++ b/.devcontainer/postCreateCommand.sh
@@ -8,7 +8,10 @@ python3 -m venv /home/inventree/dev/venv --system-site-packages --upgrade-deps
 . /home/inventree/dev/venv/bin/activate
 
 # Ensure the correct invoke is available
-pip3 install invoke --ignore-installed -U
+pip3 install --ignore-installed --upgrade invoke Pillow
+
+# install base level packages
+pip3 install -Ur contrib/container/requirements.txt
 
 # Run initial InvenTree server setup
 invoke update -s
@@ -23,3 +26,8 @@ invoke int.frontend-install
 # so that it gets copied from host to the container to have your global
 # git config in container
 rm -f /home/vscode/.gitconfig
+
+# Fix issue related to CFFI version mismatch
+pip uninstall cffi -y
+sudo apt remove --purge python3-cffi
+pip install --no-cache-dir --force-reinstall --ignore-installed cffi
diff --git a/contrib/container/Dockerfile b/contrib/container/Dockerfile
index ff8d4b3229..1cf4f3fe9b 100644
--- a/contrib/container/Dockerfile
+++ b/contrib/container/Dockerfile
@@ -9,8 +9,7 @@
 # - Runs InvenTree web server under django development server
 # - Monitors source files for any changes, and live-reloads server
 
-ARG base_image=python:3.11-alpine3.21
-FROM ${base_image} AS inventree_base
+FROM python:3.11-alpine3.21 AS inventree_base
 ARG base_image
 
 # Build arguments for this image
diff --git a/contrib/container/docker-compose.yml b/contrib/container/docker-compose.yml
index ffe8daa739..e8b07cff35 100644
--- a/contrib/container/docker-compose.yml
+++ b/contrib/container/docker-compose.yml
@@ -36,7 +36,7 @@ services:
     # Database service
     # Use PostgreSQL as the database backend
     inventree-db:
-        image: postgres:16
+        image: postgres:17
         container_name: inventree-db
         expose:
             - ${INVENTREE_DB_PORT:-5432}/tcp
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml
index 4957d45436..6f97a54a10 100644
--- a/docs/mkdocs.yml
+++ b/docs/mkdocs.yml
@@ -285,7 +285,7 @@ extra:
   min_python_version: 3.9
   min_invoke_version: 2.0.0
   django_version: 4.2
-  docker_postgres_version: 16
+  docker_postgres_version: 17
 
   version:
     default: stable