2014-09-23 21 views
20

A volte è necessario utilizzare i dati riservati quando si crea un'immagine di Docker. Ad esempio, un token API o una chiave SSH per scaricare un file remoto o per installare le dipendenze da un repository privato. Potrebbe essere opportuno distribuire l'immagine risultante e tralasciare le credenziali sensibili utilizzate per crearlo. Come si può fare?Come accedere in modo idiomatico a dati sensibili durante la creazione di un'immagine Docker?

Ho visto docker-squash che può schiacciare più livelli in uno, rimuovendo tutti i file eliminati dall'immagine finale. Ma c'è un approccio più idiomatico?

risposta

4

Per quanto riguarda l'approccio idiomatico, non sono sicuro, anche se la finestra mobile è ancora piuttosto giovane per avere troppi idiomi.

Abbiamo avuto questo stesso problema nella nostra azienda, tuttavia. Siamo giunti alle seguenti conclusioni, anche se questi sono i nostri migliori sforzi piuttosto che le migliori pratiche di docker.

1) Se sono necessari i valori al momento della compilazione: fornire un file di proprietà nel contesto della build con i valori che possono essere letti durante la compilazione, quindi il file delle proprietà può essere eliminato dopo la generazione. Questo non è così portatile ma farà il lavoro.

2) Se sono necessari i valori in fase di esecuzione: passare i valori come variabili di ambiente. Saranno visibili a chiunque abbia accesso a ps sulla scatola, ma questo può essere limitato tramite SELinux o altri metodi (onestamente, non conosco questo processo, sono uno sviluppatore e i team operativi si occuperanno di quella parte).

+3

Riguardo a 1, il problema è che quando si preme l'immagine su un indice (hub Docker, quay.io, ecc.), Vengono spinti tutti i livelli dell'immagine, incluso il livello con il file delle proprietà. Chiunque ritiri quell'immagine può avviare un contenitore con il livello che ha ancora il file delle proprietà e vedere le variabili sensibili. –

+0

Ah ok - scuse. Ho pensato che ti stavi riferendo alla condivisione di un file di build (da cui altri potrebbero creare e quindi fornire il proprio file di proprietà in fase di compilazione). –

+10

se all'interno di un singolo comando 'RUN' si scarica qualche file, si fa tutto ciò che è necessario con il suo contenuto e infine si elimina quel file, il file scaricato non verrà inserito in un livello. Deve essere in un unico comando 'RUN' – Thomasleveil

0

Il modo in cui risolviamo questo problema è che abbiamo uno strumento scritto sopra docker build. Una volta avviata una build utilizzando lo strumento, verrà scaricato un file di dock e lo si modifica. Cambia tutte le istruzioni che richiedono "il segreto" a qualcosa di simile:

RUN printf "secret: asd123poi54mnb" > /somewhere && tool-which-uses-the-secret run && rm /somewhere 

Tuttavia, questo lascia i dati segreti disponibili a chiunque abbia accesso all'immagine a meno che il livello stesso viene rimosso con uno strumento come finestra mobile-squash. Il comando utilizzato per generare ogni livello intermedio può essere trovato utilizzando the history command

0

Matthew Close parla di questo in this blog article.

Riepilogato: è necessario utilizzare docker-compose per montare informazioni sensibili nel contenitore.

+0

Sembra che il link che hai postato non funzioni. –

+0

@BenWhaley corretto. Grazie per avermi fatto sapere. – Xaser

Problemi correlati