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:
Ho ragione nel capire che Docker impedisce l’uso di mount
all’interno dei container?
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.
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 //
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.