GÜNCELLEME 2016/03/02 : Docker 1.9.0 itibariyle Docker etti hacimleri adında yalnızca veri kapların yerini . Aşağıdaki yanıtın yanı sıra bağlantılı blog yayınım da, docker içindeki veriler hakkında nasıl düşünüleceği anlamında değer taşıyor, ancak veri kapsayıcıları yerine aşağıda açıklanan kalıbı uygulamak için adlandırılmış birimler kullanmayı düşünüyor .
Bunu çözmenin kanonik yolunun sadece veri içeren kapları kullanmak olduğuna inanıyorum . Bu yaklaşımla, birim verilere tüm erişim -volumes-from
veri kabını kullanan kapsayıcılar yoluyla olur , bu nedenle ana bilgisayar uid / gid önemli değildir.
Örneğin, belgelerde verilen bir kullanım örneği bir veri birimini yedeklemektir. Bunu yapmak için, yedekleme yapmak için başka bir kap kullanılır ve birimi bağlamak için tar
de kullanılır -volumes-from
. Bu yüzden grok için kilit noktanın: ana bilgisayardaki verilere uygun izinlerle nasıl erişileceğini düşünmek yerine, ihtiyacınız olan her şeyi (yedeklemeler, göz atma vb.) Nasıl yapacağınızı düşünün. . Kapların kendilerinin tutarlı uid / gids kullanmaları gerekir, ancak ana bilgisayarda herhangi bir şeyle eşleşmeleri gerekmez, böylece taşınabilir kalırlar.
Bu benim için nispeten yeni ama belirli bir kullanım durumunuz varsa yorum yapmaktan çekinmeyin ve cevabı genişletmeye çalışacağım.
GÜNCELLEME : Yorumlarda verilen kullanım durumu için, some/graphite
grafit çalıştırmak için bir görüntünüz some/graphitedata
ve veri kabı olarak bir görüntünüz olabilir . Yani, portları ve benzeri şeyleri görmezden gelmek Dockerfile
, görüntünün some/graphitedata
şuna benzer:
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"]
Veri taşıyıcısını oluşturun ve oluşturun:
docker build -t some/graphitedata Dockerfile
docker run --name graphitedata some/graphitedata
some/graphite
Dockerfile aynı uid / gid'leri almalısınız, bu nedenle bu gibi görünebilir:
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 şu şekilde çalıştırılır:
docker run --volumes-from=graphitedata some/graphite
Tamam, şimdi bize grafit konteynırımızı ve doğru kullanıcı / grupla ilişkili sadece veri içeren konteyneri veriyor ( some/graphite
kapsayıcıyı veri kabı için de yeniden kullanabileceğinizi, giriş sırasında / cmd'yi geçersiz kıldığınızı, ancak ayrı görüntüler IMO daha net).
Şimdi, veri klasöründeki bir şeyi düzenlemek istediğinizi varsayalım. Bu nedenle, birimi ana bilgisayara bağlamak ve orada düzenlemek yerine, bu işi yapmak için yeni bir kap oluşturun. Hadi diyelim some/graphitetools
. some/graphite
Görüntüde olduğu gibi uygun kullanıcı / grup da oluşturalım .
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"]
Bu DRY'yi Dockerfile öğesinden veya Dockerfile dosyasından devralarak veya yeni bir görüntü oluşturmak yerine sadece mevcut olanlardan birini yeniden kullanın (gerektiğinde giriş noktası some/graphite
/ some/graphitedata
cmd'yi geçersiz kılar).
Şimdi, sadece şunu çalıştırın:
docker run -ti --rm --volumes-from=graphitedata some/graphitetools
ve sonra vi /data/graphite/whatever.txt
. Bu, tüm kapların eşleşen uid / gid ile aynı grafit kullanıcısına sahip olması nedeniyle mükemmel çalışır.
/data/graphite
Ana bilgisayardan asla bağlanmadığınız için, ana bilgisayar uid / gid graphite
ve graphitetools
kaplarının içinde tanımlanan uid / gid ile nasıl eşleştiği umurumda değildir . Bu kapsayıcılar artık herhangi bir ana bilgisayara dağıtılabilir ve mükemmel bir şekilde çalışmaya devam ederler.
Bununla ilgili temiz olan şey graphitetools
, artık taşınabilir bir şekilde de dağıtabileceğiniz her türlü yararlı yardımcı program ve komut dosyasına sahip olabilmesidir.
GÜNCELLEME 2 : Bu cevabı yazdıktan sonra, bu yaklaşım hakkında daha eksiksiz bir blog yazısı yazmaya karar verdim . Umut ediyorum bu yardım eder.
GÜNCELLEME 3 : Bu yanıtı düzelttim ve daha fazla ayrıntı ekledim. Daha önce sahiplik ve izinlerle ilgili bazı yanlış varsayımlar içeriyordu - sahiplik genellikle birim oluşturma zamanında, yani veri kabında atanır, çünkü birim oluşturulur. Bu bloga bakın . Bu bir zorunluluk değildir - veri kapsayıcısını yalnızca "başvuru / tanıtıcı" olarak kullanabilir ve komutu doğru kullanıcı olarak çalıştırmak için gosu ile biten bir giriş noktasındaki chown yoluyla başka bir kaptaki sahiplik / izinleri ayarlayabilirsiniz. Bu yaklaşımla ilgilenen varsa, lütfen yorum yapın ve bu yaklaşımı kullanarak bir örneğe bağlantılar sağlayabilirim.