2015-08-03 25 views
5

Docker kapsayıcısı kullanırken biraz can sıkıcı bir sorun yaşıyorum (Ubuntu'dayım, bu yüzden VMWare veya b2d gibi sanallaştırma yok). Resmimi oluşturdum ve ana bilgisayarımdan bir paylaşımlı (monte edilmiş) dizine sahip bir çalışan kapsayıcım ve ana bilgisayarımdan paylaşılan (takılı) bir dosya var. İşte docker run komut tam olarak açıklanmıştır: Bu harika çalışıyor ve her iki /components (içeriğiyle) ve dosya uygun şekilde paylaşılmaktadırPaylaşılan birim/dosya izinleri/sahiplik (Docker)

docker run -dit \ 
-p 80:80 \ 
--name my-container \ 
-v $(pwd)/components:/var/www/components \ 
-v $(pwd)/index.php:/var/www/index.php \ 
my-image 

. Ancak, dizinde değişiklik yapmak istediğimde (örneğin, yeni bir dosya veya klasör ekleyerek) veya takılı dosyayı (veya dizindeki herhangi bir dosyayı) düzenlerken, hatalı izinler nedeniyle bunu yapılamam. ls- lFh'un çalıştırılması, takılan öğeler için owner ve group öğelerinin libuuid:libuuid olarak değiştirildiğini gösterir. Dosyayı veya üst dizini değiştirmek, iş akışımı engelleyen kök izinleri gerektirir (Terminal'den değil, Sublime Text'ten çalışırken, yönetici için bir açılır pencere açılıyorum).

Neden bunu yapar? Bu konuda nasıl çalışabilirim/düzgünce kullanabilir miyim? From: Managing Data Volumes: Mount a Host File as a Data Volume:

Not: vi ve sed --in-place dahil dosyaları düzenlemek için kullanılan birçok araç, inode değişikliğine neden olabilir. Docker v1.1.0'dan bu yana, “sed: yeniden adlandırılamıyor ./sedKdJ9Dy: Aygıt veya kaynak meşgul” gibi bir hata üretecektir. Monte edilen dosyayı düzenlemek istediğinizde, ana dizini yerine monte etmek genellikle en kolay olanıdır.

Bu yerine /components ve /index.php montaj, ben yerine her ikisinin üst dizini monte gerektiğini önermek gibi görünüyor. Teorik olarak harika geliyor, ancak -v seçeneğinin davranışına ve /directory ile nasıl etkileşime girdiğine bağlı olarak, ana dizinimdeki her dosyasının libuuid:libuuid'a ait olduğu anlaşılacaktır. Buna ek olarak, kapsayıcıda gerekli olmayan üst dizin içinde pek çok şey var - araçlar oluşturma, çeşitli dosyalar, sıkıştırılmış klasörler vb. Gibi şeyler. Tüm ana dizinin montajı israfa neden olur.

benim ana makinede /components üzerinde chown user:group ve /index.phpRunning beni bu geçici bir çözüm sağlar ve konteyner ile senkronize edilmeye devam görünmektedir. Bu, monte edilmiş ana bilgisayar birimlerine sahip bir kapsayıcıyı çalıştırdığım her zaman yapmam gereken bir şey mi? Bunu yapmak için daha verimli bir yol olduğunu tahmin ediyorum ve herhangi bir yerde özel kullanım durumum için bir açıklama bulamıyorum.

Bu kapsayıcıyı başka bir program için bir modülün geliştirilmesinde kullanıyorum ve yalnızca veri taşıyıcısını yönetme isteğine sahip değilim - ana makinemden gelen tek dosya; Kalıcılık başka bir yerde (veritabanı gibi) gerekli değildir.

  • Dockerfile
  • sonrası daha uzun önlemek için pastebin Oluşturulma
  • /setup
    • . Hiçbir zaman tükenmez.

    görüntü oluşturduktan sonra, bu kullanıyorum çalıştırma komut:

    Bu dosyalarınız üzerinde ait olmaya sahiplik bitlerini değişiyor senin kabın içine senin chown -R nginx:nginx ... komutları benziyor
    docker run -dit \ 
        -p 80:80 \ 
        --name my-container \ 
        -v $(pwd)/components:/var/www/wp-content/plugins/my-plugin-directory/components \ 
        -v $(pwd)/index.php:/var/www/wp-content/plugins/my-plugin-directory/index.php \ 
        my-image 
    
  • +0

    Neden bir dizin oluşturmuyorsunuz ve bu iki dosyayı bu dizinin içindeki sembolik bağlantı olarak ekleyin, böylece oluşturulan dizini kapsayıcıya monte edebilirsiniz. – Viswesn

    +0

    @Viswesn, bunun neden uygun bir çözüm olacağını düşündüğünüzü genişletebilir misin? – Ben

    +0

    CMD betiğinizde hileli bir şekilde chowning yapan bir şeyler var gibi görünüyor (bu, docker'ın var olanları veya kapların içine yerleştirilmiş dosyaları seçmesi için beklenen bir davranış değildir) - bunu ve Dockerfile'ınızı yayınlayabilir misiniz? –

    cevap