(En iyi) docker paylaşılan birimleri için izinleri yönetmek için yolu nedir
Bir süre docker ile oynamak oldum, ve sürekli veri ile uğraşırken aynı sorunu bulmaya devam.
Benim Dockerfile
expose a volume oluşturmak veya mount a host folder inside my container 7 *kullanın
Benim sorum, izinleri ben ana bilgisayarda paylaşılan bir birim için geçerli bir şey mi? 2 seçenek düşünebilirsiniz:
Şimdiye kadar yapmaya çalıştım docker konteyner klasöre yazabilirim yani herkes okuma/yazma erişimi verin
Kabın içine bilgisayar kullanıcıları göster, daha ayrıntılı izinleri atayın. Bu mümkün olsa ve hakkında pek bir şey bulamadım. Şimdilik yapabileceğim tek şey bazı kullanıcı olarak konteyner çalıştırılır:
docker run -i -t -user="myuser" postgres
ama bu benim kullanıcı host izinleri çalışmıyor yani 9**, daha farklı bir UID vardır. Ayrıca, eğer kullanıcı eşleştirmesi bazı güvenlik riski teşkil eğer emin değilim.
Başka alternatifler?
Peki sizler bu konu ile ilgili?
CEVAP
Bu data-only containers kullanarak çözmek için meşru bir yol olduğuna inanıyorum. Bu yaklaşım ile, birime erişim tüm veri ana uıd/gıd önemi yok yani -volumes-from
veri kapsayıcı kullanan kaplar).
Örneğin, bir kullanma durumu belgelerinde belirli bir veri birimi destek veriyor. Bunu yapmak için başka bir kaba tar
üzerinden yedekleme yapmak için kullanılır ve bu birim için -volumes-from
kullanır. Sanırım kilit nokta için grok: yerine düşünme hakkında nasıl erişmek için veri ana uygun izinlere, nasıl düşünün için ne gerekiyorsa -- yedekleme, tarama, vb. başka bir kaba yoluyla. Konteynerler kendilerini tutarlı uıd/gıd kullanmanız gerekir, ama ana bilgisayarda bir şey için, böylece kalan taşınabilir göster ihtiyaçları yok.
Bu benim için oldukça yeni olarak iyi ama eğer belirli bir senaryo varsa yorum yapmaktan çekinmeyin ve cevap genişletmeye çalışacağım.
GÜNCELLEME: Daire şeklinde kullanma durumu için, bir görüntü some/graphite
grafit ve görüntü veri konteyner olarak some/graphitedata
koşmak zorunda kalabilirsin. Yani, bağlantı noktaları görmezden gelip, görüntü Dockerfile
some/graphitedata
bir şey gibi:
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"]
Ve veri kapsayıcı oluşturmak oluşturmak:
docker build -t some/graphitedata Dockerfile
docker run --name graphitedata some/graphitedata
some/graphite
Dockerfile da şöyle bir şey olabilir bu nedenle gids/aynı uıd almak gerekir:
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"]
Ve aşağıdaki gibi çalıştırmak olacaktır
docker run --volumes-from=graphitedata some/graphite
Tamam, şimdi o verir bize grafit kap ve ilişkili veri-tek konteyner ile doğru kullanıcı/grup (not tekrar kullanma some/graphite
konteyner için veri konteyner olarak, ağır basan entrypoing/cmd zaman çalışır, ama onları ayrı resimler IMO olduğunu daha net).
Şimdi, izin veri klasöründe bir şey düzenlemek istediğini söylüyor. Yani bağlama ana birim oluşturma ve düzenleme yerine, bu işi yapmak için yeni bir kapsayıcı oluşturun. Lets Ara 23**. Ayrıca uygun bir kullanıcı/grup, sadece some/graphite
görüntü gibi oluşturmanızı sağlar.
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"]
Sen-ebil yapmak bu KURU tarafından devralmasını some/graphite
some/graphitedata
Dockerfile, ya da yerine yeni bir imaj yaratmak sadece yeniden için varolan olanlar (öncelikli giriş/cmd gerekli).
Şimdi, sadece çalıştırın:
docker run -ti --rm --volumes-from=graphitedata some/graphitetools
ve sonra vi /data/graphite/whatever.txt
. Bu kaplar uıd/gıd eşleştirme ile aynı grafit kullanıcı var çünkü mükemmel çalışıyor.
Hiç ana bilgisayardan /data/graphite
mount beri, ana uıd/gıd graphite
graphitetools
konteynerler içinde tanımlanan/gıd haritalar uıd nasıl umurunda değil. Bu kaplar artık herhangi bir ana bilgisayara dağıtılabilir ve mükemmel bir şekilde çalışmaya devam edecek.
Bu konuda düzgün bir şey graphitetools
yararlı programları ve komut dosyaları her türden olabilir, şimdi de taşınabilir bir şekilde dağıtabilirsiniz.
GÜNCELLEME 2Bu cevap yazdıktan sonra, bu yaklaşım hakkında more complete blog post bir yazmaya karar verdim. Yardımcı olur umarım.
GÜNCELLEME 3Bu cevap düzelttim ve daha fazla özellikleri eklendi. Daha önce mülkiyeti ile ilgili bazı yanlış varsayımlar bulunan ve mülkiyeti genellikle birim oluşturulduğunda, çünkü bu veri kap yani birim oluşturma zamanda atanır perma. this blog bkz. Bu bir gereklilik değil ama ... sadece veri konteyner olarak bir "başvuru/işlemek" ve set sahipliği/perma başka bir kaba) chown bir giriş noktası, olan biten gosu Çalıştır komutu olarak doğru kullanıcı. Eğer herkes bu yaklaşım içinde ilgilenen varsa, lütfen yorum ve bir örnek bu yaklaşım kullanarak bağlantılar sağlayabilir.
Bir nesneyi klonlamak için en etkili y...
C bir Sözlük üzerinde yineleme için en...
JQuery ile bir dizi seçmek için bir se...
Koşullu bir sınıf uygulamak için en iy...
Java bir Toplama filtresi için en iyi ...