AKTUALIZACJA 2016-03-02 : Od Docker 1.9.0 Docker nazwał woluminy, które zastępują kontenery tylko do danych . Poniższa odpowiedź, podobnie jak mój link do posta na blogu, wciąż ma wartość w sensie myślenia o danych w oknie dokowanym, ale rozważ użycie nazwanych woluminów w celu zaimplementowania wzoru opisanego poniżej zamiast kontenerów danych.
Uważam, że kanonicznym sposobem rozwiązania tego jest użycie kontenerów zawierających tylko dane . Przy takim podejściu cały dostęp do danych woluminu odbywa się za pośrednictwem kontenerów korzystających -volumes-from
z kontenera danych, więc identyfikator użytkownika / identyfikator hosta nie ma znaczenia.
Na przykład jednym z przypadków użycia podanych w dokumentacji jest utworzenie kopii zapasowej woluminu danych. Aby to zrobić, inny kontener służy do tworzenia kopii zapasowej za pośrednictwem tar
, a także używa go -volumes-from
do zamontowania woluminu. Myślę więc, że kluczową kwestią dla grok jest: zamiast myśleć o tym, jak uzyskać dostęp do danych na hoście z odpowiednimi uprawnieniami, pomyśl o tym, jak zrobić to, czego potrzebujesz - kopie zapasowe, przeglądanie itp. - za pośrednictwem innego kontenera . Same kontenery muszą używać spójnego identyfikatora UID / GID, ale nie muszą mapować niczego na hoście, dzięki czemu pozostają przenośne.
Jest to również stosunkowo nowe dla mnie, ale jeśli masz konkretny przypadek użycia, możesz skomentować, a ja postaram się rozwinąć odpowiedź.
AKTUALIZACJA : Dla danego przypadku użycia w komentarzach możesz mieć obraz some/graphite
do uruchomienia grafitu i obraz some/graphitedata
jako kontener danych. Ignorując porty i tym podobne, Dockerfile
obraz some/graphitedata
wygląda tak:
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"]
Zbuduj i utwórz kontener danych:
docker build -t some/graphitedata Dockerfile
docker run --name graphitedata some/graphitedata
Plik some/graphite
Docker powinien mieć również ten sam identyfikator UID / GID, dlatego może wyglądać mniej więcej tak:
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"]
I byłby uruchamiany w następujący sposób:
docker run --volumes-from=graphitedata some/graphite
Ok, teraz daje nam to nasz kontener grafitowy i powiązany pojemnik tylko z danymi z odpowiednim użytkownikiem / grupą (pamiętaj, że możesz również użyć some/graphite
kontenera dla kontenera danych, zastępując entrypoing / cmd podczas jego uruchamiania, ale mając je jako oddzielne obrazy IMO jest wyraźniejsze).
Powiedzmy, że chcesz edytować coś w folderze danych. Zamiast montować wolumin na hoście i edytować go tam, utwórz nowy kontener, aby wykonać to zadanie. Nazwijmy to some/graphitetools
. Utwórzmy także odpowiedniego użytkownika / grupę, podobnie jak some/graphite
obraz.
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"]
Możesz zrobić ten OSUSZANIE, dziedzicząc z some/graphite
lub some/graphitedata
w Dockerfile, lub zamiast tworzyć nowy obraz, po prostu ponownie użyj jednego z istniejących (w razie potrzeby zastępując punkt wejścia / cmd).
Teraz wystarczy uruchomić:
docker run -ti --rm --volumes-from=graphitedata some/graphitetools
i potem vi /data/graphite/whatever.txt
. Działa to doskonale, ponieważ wszystkie pojemniki mają tego samego użytkownika grafitowego z pasującym identyfikatorem uid / gid.
Ponieważ nigdy nie montujesz /data/graphite
z hosta, nie obchodzi cię, w jaki sposób identyfikator uid / gid hosta mapuje się na identyfikator uid / gid zdefiniowany w kontenerach graphite
i graphitetools
. Kontenery te można teraz wdrożyć na dowolnym hoście i nadal będą działać idealnie.
Ciekawą rzeczą jest to, że graphitetools
może mieć wiele przydatnych narzędzi i skryptów, które można teraz wdrażać w przenośny sposób.
AKTUALIZACJA 2 : Po napisaniu tej odpowiedzi postanowiłem napisać pełniejszy post na blogu o tym podejściu. Mam nadzieję, że to pomoże.
AKTUALIZACJA 3 : Poprawiłem tę odpowiedź i dodałem więcej szczegółów. Poprzednio zawierał on niepoprawne założenia dotyczące własności i perms - własność jest zwykle przypisywana w czasie tworzenia woluminu, tj. W kontenerze danych, ponieważ wtedy powstaje wolumin. Zobacz tego bloga . Nie jest to jednak wymagane - możesz po prostu użyć kontenera danych jako „referencji / uchwytu” i ustawić własność / perms w innym kontenerze poprzez chown w punkcie wejścia, który kończy się na gosu, aby uruchomić polecenie jako poprawny użytkownik. Jeśli ktoś jest zainteresowany tym podejściem, proszę o komentarz, a ja mogę podać linki do próbki przy użyciu tego podejścia.