Montare la condivisione SMB / CIFS all’interno di un contenitore Docker

Ho un’applicazione Web in esecuzione in un contenitore Docker. Questa applicazione deve accedere ad alcuni file sul nostro file server aziendale (Windows Server con un controller di dominio Active Directory). I file che sto cercando di accedere sono file di immagine creati per i nostri clienti e l’applicazione Web li visualizza come parte del portafoglio del cliente.

Sulla mia macchina di sviluppo ho le cartelle appropriate montate tramite le voci in /etc/fstab e i mount point dell’host sono montati nel contenitore Docker tramite l’argomento --volume . Questo funziona perfettamente.

Ora sto cercando di mettere insieme un contenitore di produzione che verrà eseguito su un server diverso e che non si basa sulla condivisione CIFS montata sull’host. Così ho provato ad aggiungere le voci appropriate al /etc/fstab nel container e montarle con mount -a . Ricevo mount error(13): Permission denied .

Una piccola ricerca online mi ha portato a questo articolo sulla sicurezza Docker . Se sto leggendo correttamente, sembra che Docker neghi esplicitamente la possibilità di montare i filesystem all’interno di un container. Ho provato a montare le condivisioni di sola lettura, ma anche questo (ovviamente) è fallito.

Quindi, ho due domande:

  1. Ho ragione nel capire che Docker impedisce l’uso di mount all’interno dei container?

  2. Qualcuno può pensare a un altro modo per ottenere ciò senza montare una condivisione CIFS sull’host e quindi montare la cartella host nel contenitore Docker?

Sì, Docker ti impedisce di montare un volume remoto all’interno del contenitore come misura di sicurezza. Se ti fidi delle tue immagini e delle persone che le eseguono, puoi utilizzare il flag --privileged con la docker run per disabilitare queste misure di sicurezza.

Inoltre, puoi combinare --cap-add e --cap-drop per dare al contenitore solo le funzionalità di cui ha effettivamente bisogno. (Vedi documentazione) La capacità SYS_ADMIN è quella che garantisce i privilegi di mount.

  1. C’è un problema chiuso mount.cifs all’interno di un contenitore

https://github.com/docker/docker/issues/22197

secondo cui aggiungere

--cap-add SYS_ADMIN --cap-add DAC_READ_SEARCH

le opzioni di esecuzione renderanno operativi mount -t cifs.

L’ho provato e:

mount -t cifs /// / -o user=,password=

all’interno del contenitore funziona quindi

È ansible utilizzare il comando smbclient (parte del pacchetto Samba) per accedere al server SMB / CIFS dal contenitore Docker senza montarlo, nello stesso modo in cui si potrebbe usare curl per scaricare o caricare un file.

C’è una domanda su StackExchange Unix che si occupa di questo, ma in breve:

 smbclient //server/share -c 'cd /path/to/file; put myfile' 

Per più file c’è l’opzione -T che può creare o estrarre archivi .tar , tuttavia sembra che si tratterebbe di un processo in due fasi (uno per creare il .tar e poi un altro per estrarlo localmente). Non sono sicuro che tu possa usare un tubo per farlo in un solo passaggio.