Docker CE und CIFS volume von einem NAS

Hallo,
ich bin fast am verzweifeln und habe schon verschiedenes probiert. Volume angelegt über Portainer etc. aber ich schaffe es nicht. Also habe ich mir ein compose file erstellt:

services:
  ubuntu:
    image: ubuntu:latest
    container_name: ubuntu
    restart: unless-stopped
    volumes:
      - cifs-mount:/var/lib/data:rw
    networks:
      - myProxy

volumes:
  cifs-mount:
    driver: local
    driver_opts:
      type: cifs
      device: //<ip-of-nas>
      o: username=<username>,password=<password>,file_mode=0777,dir_mode=0777 --name cifs-mount

networks:
  myProxy:
    name: proxy
    external: true

start ich den container nun mit docker compose up -d bekomme ich einen Fehler.

pi@docker2:~/ubuntu $ docker compose up
[+] Running 2/2
 ? Volume "ubuntu_cifs-mount"  Created                                     0.0s
 ? Container ubuntu            Created                                     0.2s
Attaching to ubuntu
Gracefully stopping... (press Ctrl+C again to force)
Error response from daemon: error while mounting volume '/var/lib/docker/volumes/ubuntu_cifs-mount/_data': failed to mount local volume: mount //192.168.178.2:/var/lib/docker/volumes/ubuntu_cifs-mount/_data, data: username=docker,password=********,file_mode=0777,dir_mode=0777 --name cifs-mount: invalid argument

Kann mir jemand dabei helfen?

Vielen Dank

Warum muss es CIFS sein? Kannst du nicht einfach NFS nutzen?

Hi, es geht auch NFS. Muss ich aber erst noch auf dem NAS aktivieren.
Hab ich jetzt mal gemacht und dort zeigt es mir an als Bereitstellungspunkt:
nfs:///nfs/docker
Wie setze ich das im compose dann um?

Muss das den unbedingt immer erst gemountet werden wen der container startet? Mach doch einfach ein mount auf dem host und dem Container gibst du die Verzeichnisse

Hi,
ich möchte erreichen das der Container eben nicht startet wenn das volume nicht vorhanden ist.
Vom OS selbst kann ich das NFS Laufwerk mounten:
sudo mount -t nfs :/nfs/docker /mnt/NAS

Dan setz doch in der fstab den mount fest, so das wen der host hoch fährt das auch direkt der mount eingebunden wird, mache ich genau so, das funktioniert ohne Probleme auch für Container die sofort starten beim Hochfahren

PS:
CIFS/SMB ist eher für Windows, wen man in linux Umgebung unterwegs ist nutzt man für sowas eigentlich immer NFS, CIFS braucht man wen man von linux auf windows freigaben möchte.

Hi,
das habe ich in einem anderen Pi schon so gemacht aber irgendwie muss das doch auch aus docker gehen ohne einen Eintrag in der fstab.
Was passiert den wenn das NAS z.B. nicht eingeschaltet ist. Startet der container dann trotzdem?

Der würde vermutlich starten aber eine neue konfig dort ablegen, google doch einfach mal „compose nfs mount“ Da wirst du genug ansätze finden

Kann es den irgendwie mit den rechten zusammenhängen?
User und Gruppe unter welcher der Container läuft?

Was genau soll mit den rechten zusammenhängen?

Hi,
ich habe jetzt wieder eine menge gestestet. Ich implementiere einen mysql container (arm64v8/mysql) und habe per cifs oder auch mit NFS einen ordner vom NAS eingebunden. Wenn ich einen lokalen Ordner in dem container mit

    volumes:
      - ./database:/var/lib/mysql:rw

startet der mysql container. Benutze ich aber einen mount im OS mit:

    volumes:
      - /mnt/docker/db-data:/var/lib/mysql:rw

startet der container nicht. Deshalb bin ich auf die rechte gekommen.

Das kann durchaus sein, wen der ordner nicht die rechte hat wie der user im container sie benötigt, leicht lässt sich das prüfen, einfach mal 777 setzen, das sollte immer klappen, dan aus dem Container raus eine datei in der freigabe erstellen und anschließend prüfen welche user/gruppe die datei hat, dan kannst du der freigabe diese user/gruppe und die rechte nach Belieben setzen, bei sowas kann es durchaus sein das die user/gruppe sich unterscheiden zu den auf dem host oder freigabe

Es ist eine dumme Idee übrigens, MySQL/MariaDB-Datafiles nach „/var/lib/mysql“ via cifs zu mounten, da es grob mit den Berechtigungen nicht klappen kann.
MySQL/MariaDB sind da penibel, was das betrifft. Wenn per NAS, dann nur per NFS, aber auch das finde ich rein von der Performance nicht klug.

„/var/lib/mysql“ sollte als Owner rekursiv stets mysql:mysql haben und 755.
Die Verzeichnisse der DB in diesem Ordner sollten/müssen sogar 700 haben.

ja, vor allem für die Angreifer … sehr blöde Idee

du hast es wohl falsch verstanden, das soll nicht dauerhaft so gesetzt werden, sondern nur um zu erkennen unter welchem user/gruppe der Container schreibt,

wen im container mysql:mysql ist, das heißt noch lange nicht das du es auch so in der freigabe setzen kannst…

Dann drücke ich mich mal deutlicher aus:

  • Mir ist schon klar, dass du mit 777 erstmal testen willst. Das es für den produktiven Betrieb ein NoGo ist, möchte ich auch nicht in Frage stellen.
  • Es testweise auf 777 zu stellen heißt noch lange nicht, das es zum erstmal helfen kann, weil die Datenbank sich schon wegen dem falschen Owner weigert dort überhaupt etwas anzulegen.
  • mysql:mysql namentlich darzustellen, funktioniert nur lokal, wenn entsprechender Bezug in /etc/passwd und /etc/group vorhanden ist, andernfalls würde man es nur als bspw. 1054:1041 sehen. Somit muss es auch nicht auf einem NAS als mysql:mysql erscheinen, selbst wenn auf dem NAS ein MySQL/MariaDDB Deamon laufen würde. Mittels „id mysql“ lässt (sollte) sich die ID ermitteln.

Gut möglich, dass wir hier etwas aneinander vorbeireden. Wenn du letzteres mit deinem letzten Satz so gemeint hast, gut, andernfalls lasse es mich besser verstehen. Ich versuche auch nur zu helfen.

Hi,
ich habe jetzt NFS mal versucht. Dazu in der /etc/fstab diesen eintrag:

ip-of-nas:/nfs/docker /mnt/docker nfs defaults 0 0

und in der compose datei

/mnt/docker:/var/lib/mysql:rw

Das geht aber nicht. Von den logs die der container schreibt sieht es so aus als würde ein chown auf all directories die in docker existieren gemacht.
chown: changing ownership of ‚/var/lib/mysql/‘: Operation not permitted
Dateien sehen ich aber keine.
Hab jetzt in der fstab mal also mount point /home/pi/dbdata angegeben sowie auch im compose file. Hatte den ordner dbdata als user pi dort angelet:

drwxrwxrwx  6 root root  4096 Oct 16 07:10 dbdata

Dateien werden da aber nicht angelegt in dem Ordner.

Nochmal ein test mit dem volume in der compose datei.

  dbdata:
    driver_opts:
      type: nfs
      o: addr=192.168.178.2,nfsvers=3
      device: :/nfs/docker/db-data
services:
  mysqldb:
    image: arm64v8/mysql
    container_name: mysqldb
    restart: unless-stopped
    volumes:
       - dbdata:/var/lib/mysql:rw

da bekomme ich beim compose up -d die Meldung:

docker compose up -d
[+] Running 3/4
 ? Volume "database_dbdata"  Created                                                                                                                                                                                                    0.0s
 ? Container phpmyadmin      Stopped                                                                                                                                                                                                    0.0s
 ? Container test123         Stopped                                                                                                                                                                                                    0.0s
 ? Container mysqldb         Recreate                                                                                                                                                                                                   0.3s
Error response from daemon: failed to populate volume: error while mounting volume '/var/lib/docker/volumes/database_dbdata/_data': failed to mount local volume: mount :/nfs/docker/db-data:/var/lib/docker/volumes/database_dbdata/_data, data: addr=192.168.178.2,nfsvers=3: permission denied

Ich glaube ich bin da über etwas gestolpert:

also direkt in der compose ein nfs zu mounten habe ich nie gemacht, finde ich auch nicht unbedingt nötig, ein NAS läuft ja immer also kann man den share auch im OS mounten, ich denke dein Problem ist das du das Verzeichnis falsch angibst

so will er ein volume anlegen, du willst aber das er den pfad von einem mount benutzt

volumes:
       - dbdata:/var/lib/mysql:rw

ich würde es eher so machen wen der mount im ordner z.b. /mnt/dbdata ist

volumes:
       - /mnt/dbdata:/var/lib/mysql

das :rw dahinter habe ich für Verzeichnisse nie gemacht, nur wen es eine Datei ist z.b. :ro die nur gelesen werden darf

du kannst ja mal deine komplette compose zeigen

Hab mal ein extra compose gemacht nur dafür. Der Ordnername ubunutu ist verwirrend aber war einfach ein leerer ordner in der die compose datei liegt.

# test system for nfs share
# this is for the mysql database and phpmyadmin
#
volumes:
  dbdata:
    driver_opts:
      type: nfs
      o: addr=192.168.178.2,nfsvers=3
      device: :/nfs/docker/

services:
  mysqldb:
    image: arm64v8/mysql
    container_name: mysqldb
    restart: unless-stopped
    volumes:
#      - type: bind
#      source: dbdata
#      target: /var/lib/mysql
#      - ./database:/var/lib/mysql:rw
#      - /home/pi/dbdata:/var/lib/mysql:rw
       - dbdata:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: extrageheim
      MYSQL_DATABASE: testdb
      MYSQL_USER: mysquser
      MYSQL_PASSWORD: mysqpasswd
    healthcheck:
            test: ["CMD-SHELL", "mysqladmin ping -h localhost -user==$$MYSQL_USER --password=$$MYSQL_PASSWORD"]
    networks:
      - myProxy

networks:
  myProxy:
    name: proxy
    external: true

Das Volume wird angelegt und der container gestartet aber dieser wird ständig neu gestartet.