Bağlantılı bir klasör nasıl normal bir klasör olarak görünür


38

Yerleştirmem gereken iki Dart uygulamam var. Bu iki uygulama paylaşılan bir kaynak dizin kullanır.
Docker önler bağlam dizini dışındaki klasörlerden dosyaları ekleyerek Çünkü ( project/app1) Ben dosyaları ekleyemezsiniz ../sharedne de gelen shared(Sembolik bağ iç projects/app1).

Yine de Docker'ı kandırmanın bir yolunu arıyorum.

Basitleştirilmiş proje yapım

- projects
  - app1
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - app2
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - shared
    - source

Hareket edebilmeyi Dockerfilebir düzey yukarı ve çalıştırmak docker buildoradan ama sonra aynı dizinde (Uyg1 ve Uyg2 için) iki Dockerfiles gerekir.

Benim şimdiki fikrim, bir şekilde projects/app1/sharedbir bağlantı olduğu gerçeğini gizleyebilseydim, bu problem çözülecekti. projectsSamba kullanarak paylaşıp paylaşamayacağımı kontrol ettim ve başka bir yere yeniden bağlayabilirim ve Samba'yı normal klasörler gibi sembolik bağlantılara benzeyecek şekilde yapılandırabilirim ancak bunun desteklenip desteklenmediğini bulamadım (Samba ile ilgili fazla tecrübem yok ve henüz denemedim, sadece biraz aradım) .

Buna izin verecek başka bir araç ya da numara var mı?

Dizin yapısını değiştirmeyi tercih etmem çünkü bu durum diğer sıkıntılara neden olur ve dosyaları kopyalamaz.

Yanıtlar:


35

Çok fazla tecrübem yok, dockerbu yüzden işe yarayacağına söz veremem ama bir seçenek dizine bağlamak yerine dizini yerleştirmek olacaktır:

$ cd projects/app1
$ mkdir shared
$ sudo mount -o bind ../shared shared/

Yani ekler ../sharediçin ./sharedve sisteme tamamen şeffaf olmalıdır. Açıklandığı gibi man mount:

Bağlama bağlanır.

Linux 2.4.0’dan bu yana, dosya hiyerarşisinin bir bölümünü başka bir yerde yeniden ayarlamak mümkündür. Çağrı:

mount --bind olddir newdir

veya bu fstab girişini kullanarak:

/olddir /newdir none bind

Bu aramadan sonra aynı içeriğe iki yerden erişilebilir.


1
@zoechi, bu her iki sitede de mükemmel bir konudur. Genel bir kural olarak, U & L'de bunun gibi daha fazla teknik soru ve burada daha fazla kullanıcı alanı sorusu yayınlarım. Seçim tamamen size kalmış. Bir yandan, burada daha fazla kullanıcı var, bu yüzden daha fazla göz duvarı var, diğer taraftan U&L'de daha yüksek bir profesyonel * insan grubu yoğunluğu var. Aynı soruyu iki siteye de göndermediğinizden emin olun. Taşımak istiyorsanız, bunu silin veya mod dikkatini işaretleyin ve geçiş yapmalarını isteyin.
terdon

2
Liman işçisi arka plan planını yeniden başlatmak benim için zorunluydu! Aksi taktirde monte edilen kir kabın içinde görülmez.
loş

@ dim evet! Ben Capistrano'nun ile işe almak için çalıştı ve bu işi yoktu - I dışarı dönüşler paylaşılan dizinleri monte sonra ben konteyner başladı
CSCH

Ne yazık ki bu Windows veya OS X kullanıcıları için işe yaramaz. Bu konuyla ilgili tartışma ... canlıydı.
Jason,

kaynak kontrolüne “bağlı” montaj, örneğin github nedir? yoksa her seferinde mi yapmalıyım?
pie6k

23

Docker topluluğunda bu sorun art arda ortaya çıktı. Temelde, Dockerfileeğer çalıştırırsanız veya çalıştırırsam, tekrarlanabilir olması gerekliliğini ihlal eder . Bu nedenle, bu bilette açıklandığı gibi bu yeteneği beklemem: Dockerfile ADD komutu # 1676 ana bilgisayarındaki sembolik bağlantıları izlemez .

Öyleyse farklı bir yaklaşım düşünmelisin. Bu konuya bakarsanız: 6094 argümanındaki sembolik bağları desteklemek için ADD'yi kullanın , U & L'den ( @Patrick aka. Phemmer) bir arkadaşımız akıllıca bir çözüm sunar.

$ tar -czh . | docker build -

Bu tar, sembolik bağların geçerli dizinden kaldırılmasını ve ardından hepsini docker build -komuta yönlendirmesini sağlar.

tar adam sayfasından alıntı
-c, --create
       create a new archive

-h, --dereference
       follow symlinks; archive and dump the files they point to

-z, --gzip, --gunzip --ungzip

3
Bu mükemmel bir çözüm! Docker'ın neden bu özelliği atlamak istediklerini iddia ettiğini anlıyorum. Ancak, containerize projemi geliştirirken kullandığım iş akışında ve üretim için nasıl inşa edilmesini beklediğimde önemli bir fark var. Yerel makinemde çok sıkı bir geri besleme döngüsü istiyorum. Benim app 1 git repo ve konteynerler için inşa ortamı bir 2. repo var. Taahhüt ve zorlamak isteyip istemediğime karar vermeden önce yerel olarak düzenlemeler yapabilmem ve testleri yerel olarak yapabilmem gerekiyor. Son projemde sembolik bağlantılar veya ADD talimatları bulunmayacak.
Bruno Bronosky

6
Docker dosyaları tekrarlanamaz. Docker dosyaları tekrarlanabilir hale getirilemez, çünkü neredeyse hepsi apt-get ya da 2. veya 3. katmanda eşdeğer bir şeyleri vardır ve apt-get tekrarlanabilir değildir. Docker geliştirme stratejisini imkansız hale getirmek için yanlış yönlendirilmiş bir girişime bağlamak, Docker'ı kimseye yardım etmeyen bir dizi kötü soyutlamayla eyleme sokacak. nathanleclaire.com/blog/2014/09/29/…
Jason

1
Tamam, neden bunun bir cpkomuttan daha iyi olduğunu anlamıyorum, neden daha iyi olduğunu açıklayabilir misiniz? Ayrıca borunun kafa karıştırıcı / aşırı kıvrımlı olduğunu düşünüyorum. Neden sadece tar komutunu build komutunun üstüne koymadım. Sanırım çünkü o zaman simgelenen dir ile gerçek dir.
Alexander Mills,

1
@AlexanderMills - ne olduğunu görmenin en iyi yolu, denemek ve farkı görmek. Ayrıca yukarıda belirtilenler, bir konteynerin akmadığı bir yapıdır, yani montaj yoktur. stackoverflow.com/questions/37328370/… . Tüm bunları denemenizi şiddetle tavsiye ediyorum, çok daha mantıklı olacak.
slm

1
Sadece /bin/cp ../requirements.txt . && docker build ...
Docker'ı kurmak
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.