AGGIORNAMENTO 2016-03-02 : A partire da Docker 1.9.0, Docker ha denominato i volumi che sostituiscono i contenitori di soli dati . La risposta che segue, così come il mio post sul blog collegato, ha ancora valore nel senso di come pensare ai dati all'interno della finestra mobile ma considera l'utilizzo di volumi con nome per implementare il modello descritto di seguito piuttosto che contenitori di dati.
Credo che il modo canonico per risolverlo sia utilizzare contenitori di soli dati . Con questo approccio, tutto l'accesso ai dati del volume avviene tramite contenitori che utilizzano -volumes-from
il contenitore di dati, quindi l'host uid / gid non ha importanza.
Ad esempio, un caso d'uso riportato nella documentazione è il backup di un volume di dati. Per fare ciò, un altro contenitore viene utilizzato per eseguire il backup tramite tar
e anch'esso viene utilizzato -volumes-from
per montare il volume. Quindi penso che il punto chiave di Grok sia: piuttosto che pensare a come ottenere l'accesso ai dati sull'host con le autorizzazioni appropriate, pensare a come fare tutto ciò di cui hai bisogno - backup, navigazione, ecc. - tramite un altro contenitore . I container stessi devono usare uid / gid coerenti, ma non devono mappare nulla sull'host, rimanendo così portatili.
Questo è relativamente nuovo anche per me, ma se hai un caso d'uso particolare sentiti libero di commentare e proverò ad espandere la risposta.
AGGIORNAMENTO : per il caso d'uso indicato nei commenti, potresti avere un'immagine some/graphite
per eseguire la grafite e un'immagine some/graphitedata
come contenitore di dati. Quindi, ignorando le porte e simili, l' Dockerfile
immagine di some/graphitedata
è qualcosa di simile:
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
RUN mkdir -p /data/graphite \
&& chown -R graphite:graphite /data/graphite
VOLUME /data/graphite
USER graphite
CMD ["echo", "Data container for graphite"]
Compilare e creare il contenitore di dati:
docker build -t some/graphitedata Dockerfile
docker run --name graphitedata some/graphitedata
Il some/graphite
Dockerfile dovrebbe anche avere lo stesso uid / gids, quindi potrebbe assomigliare a questo:
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
# ... graphite installation ...
VOLUME /data/graphite
USER graphite
CMD ["/bin/graphite"]
E sarebbe eseguito come segue:
docker run --volumes-from=graphitedata some/graphite
Ok, ora che ci dà il nostro contenitore di grafite e il contenitore associato solo ai dati con l'utente / gruppo corretto (nota che potresti riutilizzare il some/graphite
contenitore anche per il contenitore di dati, sovrascrivendo il entrypoing / cmd durante l'esecuzione, ma avendo come immagini separate IMO è più chiaro).
Ora, supponiamo che tu voglia modificare qualcosa nella cartella dei dati. Quindi, piuttosto che associare il montaggio del volume all'host e modificarlo lì, creare un nuovo contenitore per fare quel lavoro. Chiamiamolo some/graphitetools
. Consente inoltre di creare l'utente / gruppo appropriato, proprio come l' some/graphite
immagine.
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
VOLUME /data/graphite
USER graphite
CMD ["/bin/bash"]
Puoi fare questo DRY ereditando da some/graphite
o some/graphitedata
nel Dockerfile, o invece di creare una nuova immagine semplicemente riutilizzare una di quelle esistenti (sovrascrivendo entrypoint / cmd secondo necessità).
Ora corri semplicemente:
docker run -ti --rm --volumes-from=graphitedata some/graphitetools
e poi vi /data/graphite/whatever.txt
. Funziona perfettamente perché tutti i contenitori hanno lo stesso utente di grafite con uid / gid corrispondenti.
Dal momento che non esegui mai il mount /data/graphite
dall'host, non ti interessa come l'host uid / gid viene mappato sull'uid / gid definito all'interno dei contenitori graphite
e graphitetools
. Questi contenitori ora possono essere distribuiti a qualsiasi host e continueranno a funzionare perfettamente.
La cosa bella di questo è che graphitetools
potrebbe avere ogni sorta di utilità e script utili, che ora puoi anche distribuire in modo portatile.
AGGIORNAMENTO 2 : Dopo aver scritto questa risposta, ho deciso di scrivere un post sul blog più completo su questo approccio. Spero possa essere d'aiuto.
AGGIORNAMENTO 3 : ho corretto questa risposta e aggiunto ulteriori dettagli. In precedenza conteneva alcuni presupposti errati sulla proprietà e sui permanenti: la proprietà viene generalmente assegnata al momento della creazione del volume, ad esempio nel contenitore di dati, poiché è in quel momento che viene creato il volume. Vedere questo blog . Questo non è un requisito, tuttavia: è possibile utilizzare il contenitore di dati come "riferimento / handle" e impostare la proprietà / permanenti in un altro contenitore tramite chown in un punto di accesso, che termina con gosu per eseguire il comando come utente corretto. Se qualcuno è interessato a questo approccio, si prega di commentare e posso fornire collegamenti a un campione usando questo approccio.