Ein paar kleine Tricks und Kniffe zum Thema Docker.
mysqldump ohne Passwort in Prozessliste
Unter docker werden die Zugangsdaten meist über Umgebungsvariablen weitergegeben.
Arbeitet man jedoch bei mysqldump
mit dem Parameter -p
gibt es
folgende Warnung
mysqldump: [Warning] Using a password on the command line interface can be insecure.
Um jetzt nicht alles nach /dev/null
umzuleiten, um noch echte Fehler
mitzubekommen, kann man mittels des Parameters --defaults-file
das
Passwort in eine Datei kopieren. Da sich Zugangsdaten ändern können,
empfiehlt es sich, das dynamisch per Script zu erzeugen und das Passwort
aus der Umgebungsvariable des Containers auszulesen.
Das Script legt man entweder in ein lokales Volume oder kopiert es via
docker cp
in den Container.
Das Beispiel-Script zum dynamischen Erzeugen der Credentials-Datei:
1#!/bin/bash
2CRED_FILE="/docker-entrypoint-initdb.d/credentials-root.conf"
3#loeschen
4> "${CRED_FILE}"
5chmod 600 "${CRED_FILE}"
6echo "[client]" >> "${CRED_FILE}"
7echo "password=${MYSQL_ROOT_PASSWORD}" >> "${CRED_FILE}"
Und noch ein Auszug aus einem Backup-Script:
1docker exec -i onlyoffice-mysql-server /bin/bash /docker-entrypoint-initdb.d/gen_cred_config.sh
2(docker exec -i onlyoffice-mysql-server mysqldump --defaults-file=/docker-entrypoint-initdb.d/credentials-root.conf <weitere Dump-Parameter> -u root -h<hostname> | xz -c > "${BACKUPDIR}/dump.sql.xz"
Umgebungsvariable aus Docker-Container auslesen
1docker exec -i onlyoffice-community-server /bin/bash -c '/bin/echo ${MYSQL_SERVER_PASS}'
Unterordner in Docker-Volume ignorieren
Dem docker-compose
ein Verzeichnis der lokalen Maschine übergeben,
aber einzelne Unterverszeichnisse davon ausnehmen:
Das funktioniert, indem für die auszunehmenden Unterordner ein zweites Volume angeben wird. Volume darf keine Zuordnung mit einem Doppelpunkt enhalten:
1volumes:
2- ./webseite/html:/var/www/html
3- /var/www/html/static/
Im Beispiel bekommt ein Webserver die ganze Webseite übergeben, der
Ordner static
wird aber aus dem Container benutzt.
Backups & Recover via Volume mounten
reingucken
1docker run -it --rm -v portainer_data:/data:ro -v $(pwd):/backup alpine /bin/sh
sichern
Variante 1
1docker run --rm -v portainer_data:/data:ro -v $(pwd):/backup alpine tar cjvf /backup/data.tbz2 -C /data ./
Variante 2
1docker run --rm -v portainer_data:/data alpine tar cf - -C /data ./ | xz > ./portainer_data_volume.txz
Recover
1docker run --rm -v portainer_data:/data -v ./portainer_data_volume.txz:/backup.tgz alpine tar tJf -C /data /backup.tgz
Volumes
Wie unterscheiden sich nochmal die Bezeichnungen bei den Volumes?
- bind volume
- named volume
- volume
Logfiles auf die Konsole
Logfile-Ausgaben können über STDOUT einfach an das "Terminal" geblasen
werden, der dann via docker log <container-name>
bzw. Portainer
auslesbar ist.
Eine Apache-Konfig conf-enabled/other-vhosts-access-log.conf
kann z.B. so aussehen:
1# Define an access log for VirtualHosts that don't define their own logfile
2CustomLog /proc/self/fd/1 vhost_combined
Im Container selbst ist dann der Grund zu sehen, warum das funktioniert:
1# ls -l /proc/self/fd/1
2lrwx------. 1 root root 64 Jul 8 16:19 /proc/self/fd/1 -> /dev/pts/0
Habe ich mal in einem ubuntu-basierten Container gesehen, ziemlich genial.
docker ENTRYPOINT
Weil ich mir nie merken kann, wie wann was gestartet wird, hier mal eine Tabelle:
ENTRYPOINT | CMD | run-Parameter | ausgeführt wird |
---|---|---|---|
["script.sh"] |
script.sh |
||
["script.sh"] |
/bin/bash |
script.sh /bin/bash |
|
["script.sh"] |
["mysqld"] |
script.sh mysqld |
|
["script.sh"] |
["mysqld"] |
/bin/bash |
script.sh /bin/bash |
["/bin/sh"] |
/bin/sh |
||
["/bin/sh"] |
/bin/bash |
/bin/bash |
Zeitzonen
Die lokale Zeitzone lässt sich per Volume-Mount an den Container durchreichen, sofern die Applikation das unterstützt bzw. beachtet.
1 volumes:
2 - /etc/timezone:/etc/timezone:ro
3 - /etc/localtime:/etc/localtime:ro
Pull und Restart
1docker compose up -d --pull always
bzw.
1docker compose up -d --build --pull always
Changelog
Datum | Änderung |
---|---|
08.11.2023 | Backup via Volume weitere Variante sowie Recover-Möglichkeit. |
01.06.2024 | docker ENTRYPOINT |
25.11.2024 | Zeitzonen-Volumes |
02.05.2025 | Pull und Restart |