===== Docker Nextcloud Image selbst bauen =====
Möchte man ein Image verändern oder aus welchen Gründen selbst bauen, sind folgende Schritte notwendig (hier ein Beispiel mit
Nextcloud 32.0.4 )
Ich benutze die Apache Version
===== Basis-Image =====
==== 1. Basis-Image holen ====
# Quell‑Repo klonen
git clone https://github.com/nextcloud/docker.git
cd docker/32/apache
2. prüfen, ob die gewünschte Version im Dockerfile vorhanden ist, in unserem Beispiel ENV NEXTCLOUD_VERSION 32.0.4
==== Dockerfile eventuell anpassen ====
3. Im Dockerfile kann man einige Variable anpassen, wenn man das möchte. Beispiel:
ENV PHP_MEMORY_LIMIT 2048M
ENV PHP_UPLOAD_LIMIT 2048M
ENV PHP_OPCACHE_MEMORY_CONSUMPTION 256
opcache.interned_strings_buffer=64
3.1. Besser ist es jedoch, ein eigenes volumne in docker-compose einzubinden. Beispiel
Beispielordnerstruktur:
projektordner/
├── docker-compose.yml
├── my-php/
│ └── 99-custom.ini ← Hier liegt deine PHP-Konfig
Beispiel für eine 99-custom.ini
; --------------------------------------
; Benutzerdefinierte PHP-Einstellungen
; --------------------------------------
; Arbeitsspeicher
memory_limit = 2048M
; Upload-Limit für einzelne Dateien
upload_max_filesize = 2048M
; Maximalgröße von POST-Daten
post_max_size = 512M
; Maximale Skriptlaufzeit
max_execution_time = 300
max_input_time = 300
; Maximale Anzahl gleichzeitiger Datei-Uploads
max_file_uploads = 200
; Zeitzone (optional)
date.timezone = Europe/Vienna
Testbeispiel, ob die Werte auch wirklich geladen werden:
docker exec -it nextcloud php -i | grep memory_limit
docker exec -it nextcloud php -i | grep upload_max_filesize
So bindest du die Datei in docker-compose ein.
- ./my-php/99-custom.ini:/usr/local/etc/php/conf.d/99-custom.ini
==== docker-compose.yml anpassen und build starten ====
4. Ich lasse docker-compose.yml den build selbst machen. Dazu verändert man folgende Zeilen in docker-compose.yml in derm Abschnitt von Nextcloud Image
#---- habe ein eigenes Image erstellt --------
build:
context: /home-to-own-docker-image/docker/31/apache
dockerfile: Dockerfile
image: nextcloud:32.0.4-apache
5. Build Prozess starten
- zuerst Syntax überprüfen
docker compose config
docker-compose up -d
Ist ein lokales Image vorhanden, wird der build Prozess nicht gestartet. Das kann man erzwingen:
docker compose up -d --build
6. Abwarten, bis der build Prozess durchgelaufen ist, danach kann man die Version prüfen.
==== Mehrere Instanzen in einem Docker Daemon ====
Laufen alle Nextcloud Container am selben Docker daemon, reicht es völlig, **ein einziges Mal ein Tagged Image zu haben**. Jede ''docker‑compose.yml'' muss dann nur noch **dieses Tag als ''image:'' verwenden** – ohne ''build:'' ‑Block. Der Daemon liefert das Image aus seinem lokalen Cache; es wird **nichts neu gebaut und nichts gepullt**
Vorgangsweise:
1. Image einmalig taggen
docker tag $(docker images -q --filter reference='nextcloud:32.0.4-apache' | head -n1) \
my-nextcloud:32.0.4-apache
2. setze in alle docker-compose.yml folgende ein (ohnue build:)
image: my-nextcloud:32.0.4-apache
3. Container pro Nextcloud Instanz neu erzeugen
docker compose pull # wird sofort übersprungen, weil Image lokal
docker compose up -d # startet mit dem vorhandenen Layer-Cache
==== Tipp: Versionsvariable nur 1x pflegen: ====
1. Lege in jedem Instanz‑Verzeichnis (oder als Symlink auf eine gemeinsame Datei) eine **''.env'' ** an – Compose ersetzt Variablen automatisch
# .env
NEXTCLOUD_IMAGE=my-nextcloud:32.0.4-apache
2. In jedem docker-compose.yml im Nextcloud Abschnitt:
image: ${NEXTCLOUD_IMAGE}
2. Baue das neue Image **einmal**, ändere nur die Zeile in **einer** ''.env'', , wen du einen Symlink gesetzt hast, sonst in jeder, dann:
docker compose up -d # Container aller Instanzen werden ersetzt
2. gemeinsame .env erzeugen
mkdir -p /srv/nextcloud/common
cat>/srv/nextcloud/common/.env <<'EOF'
NEXTCLOUD_IMAGE=my-nextcloud:32.0.4-apache
REDIS_HOST=redis
EOF
3. Symlink in jeder Instanz anlegen **(am beseten mit absolutem Pfad)**
ln -s /srv/nextcloud/common/.env .env
4. Docker-compose.yml nutzt die Variable
version: "3.9"
services:
nextcloud:
image: ${NEXTCLOUD_IMAGE} # kommt aus der (verlinkten) .env
# …
==== Docker Image auf neuen Server übertragen ====
1. Image nur einmal als Datei erzeugen
docker save my-nextcloud:32.0.4-apache \
| gzip> my-nextcloud_32.0.4-apache.tar.gz
2. **Datei auf den Ziel‑Host übertragen** (SCP, rsync, USB‑Stick …)
scp -P Portnummer my-nextcloud_32.0.4-apache.tar.gz user@host2:/tmp/
3. dort einspielen
gunzip -c /tmp/my-nextcloud_32.0.4-apache.tar.gz | docker load
4. Prüfen, ob das Image vorhanden ist
docker images my-nextcloud:32.0.4-apache
Jetzt taucht es lokal als ''my-nextcloud:32.0.4-apache'' auf – Compose kann’s direkt nutzen.
5 Docker-compose kann das File direkt nutzen
services:
nextcloud:
image: my-nextcloud:32.0.4-apache
pull_policy: never # verhindert versehentliche Pull‑Versuche
6. aufrufen mit
docker compose up -d # reicht vollkommen, kein Pull nötig
Falls du ganz sicher gehen willst:
docker compose up -d --pull never --no-build