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