Hallo zusammen, ich brauche mal eure Hilfe.
Ich möchte gerne eine Website / WebApp entwickeln (lernen) und suche dafür eine passenden AIO Docker.
(zum testen würde ich erstmal ein klassisches CMS wie (Joomla o.Ä. dort Hosten)
Der Docker sollte einen Nginx, mit den Features PHP, Flask, usw. enthalten. Als weitere Datenbank wollte ich dann entweder MariaDB oder alternativ MySQL verwenden. (klar diese könnte ich gesondert Hosten, wollte sie aber diesmal mit in dem Docker haben)
Mein Ziel ist es am Ende meine WebApp als eigenständigen Docker anderen zu teilen.
Da ich hierzu keine Docker von der Stange gefunden habe, der das abbildet, habe ich versucht mir einen Docker selbst zu erstellen. (Falls jemand eine Docker kennt, die meinen Anforderungen entspricht, bin ich über einen Tipp dankbar)
Ich muss dazu sagen, das ich bis jetzt immer nur fertige Docker verwendet habe und nun das erste mal einen Docker selbst erstellt habe.
Was ich bis jetzt gemacht habe:
1. Dockerfile erstellt in welchem Nginx, mit MariaDB und PHP mehr schlecht als recht installiert werden. (Dockerfile folgt weiter unten)
(Problem ist das die Ngnix config datei nicht automatisch in den Config-Ordner unter Appdata abgelegt wird)
2. Entrypoint.sh erstellt welche gewisse abhängigkeiten prüft und Ordner unter Appdata/Dockername/ bereitstellt
3. Supervisord.conf erstellt um die Dienste starten
Hier meine Files zur Ansicht (sorry hab den Knopf zum Einklappen nicht gefunden)
#Dockerfile
# Verwende das offizielle Nginx-Alpine-Image
FROM nginx:alpine
# Installiere benötigte Pakete für PHP, Python und Supervisor
RUN apk add --no-cache \
php83 php83-fpm php83-mysqli php83-json php83-openssl php83-curl \
python3 py3-pip \
mariadb mariadb-client \
supervisor \
&& rm -rf /var/cache/apk/*
# Erstelle notwendige Verzeichnisse (für Nginx & Supervisor)
RUN mkdir -p /var/log/supervisor /docker-entrypoint.d/
# Kopiere Supervisor-Konfigurationsdatei
COPY supervisord.conf /etc/supervisord.conf
# Kopiere EntryPoint-Skript für automatische Einrichtung
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
# Setze Arbeitsverzeichnis
WORKDIR /var/www
# Exponiere Ports für Nginx (HTTP, HTTPS) und Flask
EXPOSE 80 443 5000
# Startet das EntryPoint-Skript
CMD ["/entrypoint.sh"]
#Entrypoint.sh
#!/bin/sh
set -e
# Logging-Funktion (lässt sich mit Umgebungsvariable deaktivieren)
entrypoint_log() {
if [ -z "${NGINX_ENTRYPOINT_QUIET_LOGS:-}" ]; then
echo "$@"
fi
}
entrypoint_log "🛠️ Starte EntryPoint-Skript..."
# Sicherstellen, dass benötigte Verzeichnisse existieren
mkdir -p /mnt/user/appdata/AIO-Webserver/html
mkdir -p /mnt/user/appdata/AIO-Webserver/flaskapp
mkdir -p /mnt/user/appdata/AIO-Webserver/mariadb
mkdir -p /mnt/user/appdata/AIO-Webserver/nginx
mkdir -p /mnt/user/appdata/AIO-Webserver/nginx/custom-configs
mkdir -p /docker-entrypoint.d/
entrypoint_log "📂 Standardkonfigurationen werden überprüft..."
# Prüfen, ob Nginx vorhanden ist – falls nicht, installieren
if [ ! -f /etc/nginx/nginx.conf ]; then
entrypoint_log "⚠️ Nginx wurde nicht gefunden. Installiere jetzt..."
apk add --no-cache nginx
fi
# Falls /mnt/user/appdata/AIO-Webserver/nginx leer ist, Standarddateien aus /etc/nginx kopieren
if [ ! "$(ls -A /mnt/user/appdata/AIO-Webserver/nginx 2>/dev/null)" ]; then
entrypoint_log "📝 Kopiere Standard-Nginx-Konfiguration..."
cp -r /etc/nginx/* /mnt/user/appdata/AIO-Webserver/nginx/
fi
# Falls Supervisor-Konfiguration nicht existiert, kopiere Standarddatei
if [ ! -f /mnt/user/appdata/AIO-Webserver/supervisord.conf ]; then
entrypoint_log "📝 Kopiere Standard-Supervisor-Konfiguration..."
cp /etc/supervisord.conf /mnt/user/appdata/AIO-Webserver/supervisord.conf
fi
# Falls keine Standard-Webseite existiert, erstelle eine
if [ ! -f /mnt/user/appdata/AIO-Webserver/html/index.html ]; then
entrypoint_log "🌐 Erstelle Standard-Webseite..."
echo "<h1>AIO-Webserver läuft erfolgreich!</h1>" > /mnt/user/appdata/AIO-Webserver/html/index.html
fi
# Prüft, ob `/docker-entrypoint.d/` Skripte enthält und führt sie aus
if /usr/bin/find "/docker-entrypoint.d/" -mindepth 1 -maxdepth 1 -type f -print -quit 2>/dev/null | read v; then
entrypoint_log "🔄 Führe zusätzliche Skripte in /docker-entrypoint.d/ aus..."
find "/docker-entrypoint.d/" -follow -type f -print | sort -V | while read -r f; do
case "$f" in
*.sh)
if [ -x "$f" ]; then
entrypoint_log "▶ Starte Skript: $f"
"$f"
else
entrypoint_log "⚠ Skript ist nicht ausführbar: $f"
fi
;;
*) entrypoint_log "ℹ Ignoriere Datei: $f";;
esac
done
fi
entrypoint_log "🚀 Starte Supervisor..."
exec /usr/bin/supervisord -c /etc/supervisord.conf
#Superwisord.conf
[supervisord]
nodaemon=true
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock
[program:nginx]
command=/usr/sbin/nginx -g 'daemon off;'
autostart=true
autorestart=true
stderr_logfile=/var/log/nginx.err.log
stdout_logfile=/var/log/nginx.out.log
[program:flask]
command=python3 /var/www/flaskapp/app.py
autostart=true
autorestart=true
stderr_logfile=/var/log/flask.err.log
stdout_logfile=/var/log/flask.out.log
[program:mariadb]
command=/usr/bin/mysqld_safe --skip-grant-tables
autostart=true
autorestart=true
stderr_logfile=/var/log/mysql.err.log
stdout_logfile=/var/log/mysql.out.log
[program:php-fpm]
command=/usr/sbin/php-fpm83 --nodaemonize
autostart=true
autorestart=true
stderr_logfile=/var/log/php-fpm.err.log
stdout_logfile=/var/log/php-fpm.out.log
Vermutlich wird jetzt jeder erfahrene Programmierer die Hände über den Kopf zusammenschlagen und mir sagen das es alles Mist ist was ich da zusammengeschusstert habe, ich wusste es eben nicht besser. (KI hat geholfen)
Was der Docker beim starten nicht macht:
Es werden die Dateien im Ngnix Ordner (fastcgi_params, mime.types, nginx.conf) nicht automatisch angelegt unter Appdata/AIO-Webserver/nginx/ und wenn ich mir den standart Nginx Docker mal anschaue, fehlt da glaube ich noch mehr.
Weiterhin erstellt er mir keine DB unter dem Ordner Appdata/AIO-Webserver/mariadb/, sowie unter Appdata/flaskapp/ die app.py
Nachdem ich mit viel rummgefummel obigen Docker tatsächlich irgenwie zum laufen gebracht habe, bin ich mir ziemlich sicher, das dies eben nicht der richtige Weg ist (zumindes was ich mir mit der KI da zurechtgefummelt habe)
Alternativ hatte ich versucht die originale Nginx Docker zu erweitern, jedoch waren dort die von mir hinzugefügten Services nicht Persistent und nach jedem Neustart oder Neuinstallation weg. (Falls es da einen Weg gibt, wäre ich über einen Tipp sehr Dankbar)
Nach weiteren Recherchen habe ich dann versucht über Docker-Compose einzelne Docker zu einem Stack zu verbinden, hab das aber dann erstmal auf Eis gelegt.
Weitere Idee war, einen vorhandenes Projekt von Github zu kopieren und zu erweitern (wenn man das darf, bzw. wenn das geht)
Ich danke euch im Voraus für eure Hilfe und hoffe auf hilfreiche Tipps.