From 1666c25d1379d494f465421c27e599aebebd54b8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Matou=C5=A1=20Volf?= <git@matousvolf.cz>
Date: Fri, 3 Jan 2025 10:41:36 +0100
Subject: [PATCH] refactor: build development Tailwind CSS in a separate Docker
 service

---
 .dockerignore                       |  4 ++--
 docker-compose-dev.yaml             | 17 ++++++++++++++---
 docker/dev/app/Dockerfile           | 21 +++++----------------
 docker/dev/app/entrypoint.sh        |  3 ---
 docker/dev/app/supervisord.conf     | 23 -----------------------
 docker/dev/style-builder/Dockerfile | 13 +++++++++++++
 src/styles/tailwind.config.js       |  4 ++--
 7 files changed, 36 insertions(+), 49 deletions(-)
 delete mode 100755 docker/dev/app/entrypoint.sh
 delete mode 100644 docker/dev/app/supervisord.conf
 create mode 100644 docker/dev/style-builder/Dockerfile

diff --git a/.dockerignore b/.dockerignore
index cbbd516..0b6f5b9 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -8,5 +8,5 @@
 .dockerignore
 /docker-compose-dev.yml
 /docker-compose-prod.yml
-/docker/dev/app/Dockerfile
-/docker/prod/app/Dockerfile
+/docker/dev/*/Dockerfile
+/docker/prod/*/Dockerfile
diff --git a/docker-compose-dev.yaml b/docker-compose-dev.yaml
index 8710d55..7a0bf21 100644
--- a/docker-compose-dev.yaml
+++ b/docker-compose-dev.yaml
@@ -12,11 +12,22 @@ services:
       - ./Cargo.toml:/srv/app/Cargo.toml
       - ./diesel.toml:/srv/app/diesel.toml
       - ./Dioxus.toml:/srv/app/Dioxus.toml
-      - ./package.json:/srv/app/package.json
-      - ./package-lock.json:/srv/app/package-lock.json
     restart: always
     ports: ["8000:8000"]
-    depends_on: ["db"]
+    depends_on: ["db", "style-builder"]
+
+  style-builder:
+    build:
+      dockerfile: docker/dev/style-builder/Dockerfile
+    volumes:
+      - ./assets:/srv/app/assets
+      - ./src:/srv/app/src
+      - ./package.json:/srv/app/package.json
+      - ./package-lock.json:/srv/app/package-lock.json
+    # To prevent the container from exiting.
+    # See https://github.com/rails/rails/issues/44048.
+    tty: true
+    restart: always
 
   db:
     image: postgres:16.4-bookworm
diff --git a/docker/dev/app/Dockerfile b/docker/dev/app/Dockerfile
index e84ad18..c933b70 100644
--- a/docker/dev/app/Dockerfile
+++ b/docker/dev/app/Dockerfile
@@ -1,27 +1,16 @@
+# 1.83.0-bookworm
 FROM rust@sha256:a45bf1f5d9af0a23b26703b3500d70af1abff7f984a7abef5a104b42c02a292b
 
-RUN cargo install dioxus-cli diesel_cli \
- && apt-get update && apt-get install -y --no-install-recommends \
-    nodejs=18.19.0+dfsg-6~deb12u2 \
-    npm=9.2.0~ds1-1 \
-    supervisor=4.2.5-1 \
- && apt-get clean \
- && rm -rf /var/lib/apt/lists/*
+RUN cargo install dioxus-cli diesel_cli
 
 COPY . /srv/app
 WORKDIR /srv/app
 
-RUN npm install
-
-COPY docker/dev/app/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
-
-RUN chown -R 1000:1000 /srv/app \
- && chown -R 1000:1000 /usr/local/cargo \
- && mkdir -p /.local/share/dioxus \
- && chown -R 1000:1000 /.local/share/dioxus
+RUN mkdir -p /.local/share/dioxus \
+ && chown -R 1000:1000 /srv/app /usr/local/cargo /.local/share/dioxus
 
 HEALTHCHECK CMD curl --fail -H "Accept: text/html" http://localhost:8000 || exit 1
 
 USER 1000:1000
 
-CMD ["sh", "docker/dev/app/entrypoint.sh"]
+CMD ["dx", "serve", "--addr", "0.0.0.0", "--port", "8000"]
diff --git a/docker/dev/app/entrypoint.sh b/docker/dev/app/entrypoint.sh
deleted file mode 100755
index 5f92f1f..0000000
--- a/docker/dev/app/entrypoint.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/bash
-
-supervisord -c /etc/supervisor/conf.d/supervisord.conf
diff --git a/docker/dev/app/supervisord.conf b/docker/dev/app/supervisord.conf
deleted file mode 100644
index 8c7b300..0000000
--- a/docker/dev/app/supervisord.conf
+++ /dev/null
@@ -1,23 +0,0 @@
-[supervisord]
-nodaemon=true
-logfile=/dev/null
-logfile_maxbytes=0
-pidfile=/dev/null
-
-[program:npm]
-command=npm run watch
-directory=/srv/app
-autostart=true
-autorestart=true
-stdout_logfile=/dev/fd/1
-stdout_logfile_maxbytes=0
-redirect_stderr=true
-
-[program:dx]
-command=dx serve --addr 0.0.0.0 --port 8000
-directory=/srv/app
-autostart=true
-autorestart=true
-stdout_logfile=/dev/fd/1
-stdout_logfile_maxbytes=0
-redirect_stderr=true
diff --git a/docker/dev/style-builder/Dockerfile b/docker/dev/style-builder/Dockerfile
new file mode 100644
index 0000000..4465c9b
--- /dev/null
+++ b/docker/dev/style-builder/Dockerfile
@@ -0,0 +1,13 @@
+# 23-alpine3.21
+FROM node@sha256:c61b6b12a3c96373673cd52d7ecee2314e82bca5d541eecf0bc6aee870c8c6f7
+
+WORKDIR /srv/app
+
+COPY ./package.json ./package.json
+COPY ./package-lock.json ./package-lock.json
+
+RUN npm install
+
+USER 1000:1000
+
+CMD ["npm", "run", "watch"]
diff --git a/src/styles/tailwind.config.js b/src/styles/tailwind.config.js
index cd39914..39479fd 100644
--- a/src/styles/tailwind.config.js
+++ b/src/styles/tailwind.config.js
@@ -1,7 +1,7 @@
-/** @type {import('tailwindcss').Config} */
+/** @type {import("tailwindcss").Config} */
 module.exports = {
   mode: "all",
-  content: ["./src/**/*.{rs,html,css}", "./dist/**/*.html"],
+  content: ["./src/**/*.{rs,html,css}"],
   theme: {
     fontFamily: {
       sans: ["Inter", "sans-serif"],