Docker, bağlam dışında symlink'i takip eder


93

Yine başka bir Docker symlink sorusu. Tüm Docker yapılarıma kopyalamak istediğim bir sürü dosyam var. Benim dir yapım:

parent_dir
    - common_files
        - file.txt
    - dir1
        - Dockerfile  
        - symlink -> ../common_files

Yukarıdaki örnekte, dir1 içinde docker derlediğimde file.txt dosyasının kopyalanmasını istiyorum. Ancak file.txt'nin birden çok kopyasını tutmak istemiyorum. Bu bağlantı başına , docker sürüm 0.10'dan itibaren docker derlemesi

ADD oluşturma talimatları için kapsayıcının kökündeki sembolik bağlantıları izleyin.

Ancak Dockerfile dosyamda bu satırlardan herhangi biriyle derlediğimde böyle bir dosya veya dizin alamıyorum:

ADD symlink /path/dirname veya ADD symlink/file.txt /path/file.txt

bağlama seçeneği benim için çözmez (çapraz platform ...). tar -czh . | docker build -tBaşarı olmadan denedim .

Docker'ın sembolik bağlantıyı izlemesini ve common_files / file.txt dosyasını yerleşik kapsayıcıya kopyalamasını sağlamanın bir yolu var mı?

Yanıtlar:


70

Bu mümkün değil ve uygulanmayacak. Lütfen 1676 numaralı github sorunu hakkındaki tartışmaya bir göz atın :

Tekrarlanabilir olmadığı için buna izin vermiyoruz. Makinenizdeki bir sembolik bağlantı benim makinemle aynı değildir ve aynı Dockerfile iki farklı sonuç üretecektir. Ayrıca / etc / paasswd'ye sembolik bağların olması da sorunlara neden olur çünkü yerel dosyalarınızı değil, ana dosyaları bağlar.


Teşekkür ederim. Evet, bu bağlantıyı daha önce fark ettim ama bunun docker'ın çok daha eski bir sürümü (0.6.1) için olduğunu düşündüm. 0.10'un değişiklik günlüğü, bunun olası olduğunu belirtiyor github.com/docker/docker/blob/master/…
Ravi

Ayrıca "parent_dir" herhangi bir bilgisayarda teslim alınmışsa ve sembolik bağın "common_files" için göreceli yolu varsa, tekrarlanabilir olacaktır.
Ravi

2
Kişisel alıntı Follow symlinks inside container's root for ADD build instructions.aracı kabın içine sembolik bağ izlenir. Derleme bağlam dizininde değil. Gelen ADD file.txt /dir/file.txtdizinde dirbir sembolik olabilir. Cevabımda aktardığım argümanlar hala geçerli ve son versiyonda sembolik bağlantılar hala izlenmiyor. Git gibi revizyon kontrol sistemlerinde sembolik bağlantıları sakladığınızda sorunlarla karşılaşabilirsiniz (tekrarlanabilirlikle ilgili) . Bu nedenle lütfen bu soruya bakın .
0x7d7b

1
Git'teki sembolik bağlantılarla ilgili düşüncenizi anlıyorum. Ancak sembolik bağlantıların git'e girmesi gerekmez. Basit bir kurulum betiği, sembolik bağlantılar oluşturan yerel envanteri hazırlayabilir. Bana göre, paylaşılan bir dosyanın 'n' kopyasını tutmanın maliyeti bakım açısından çok yüksek görünüyor. Belki onu apaçi dışında sunmam gerekecek. Teşekkür ederim.
Ravi

21
ne yazık, mantığı takip etmediğim noktayı görünce beni ısırıyor. Git, sembolik bağları mükemmel bir şekilde ele alıyor ve ayrıca derlemelerin kaynak deponun kontrol edildiği tüm makineler ve ortamlarda çalışmasını bekliyorum ..?
Gregor

9

Bir olasılık, derlemeyi ana dizinde çalıştırmaktır:

$ docker build [tags...] -f dir1/Dockerfile .

(Veya eşdeğer olarak, alt dizinde)

$ docker build  [tags...] -f Dockerfile ..

Dockerfile, uygun yollarla kopyalama / ekleme yapmak için yapılandırılmalıdır. Kurulumunuza bağlı olarak .dockerignore, ana babadan içeriğe dahil edilmesini istemediğiniz şeyleri dışarıda bırakmasını isteyebilirsiniz.


8

Hala bu sorunu yaşayan biri varsa, superuser.com'da çok güzel bir çözüm buldum:

/superuser/842642/how-to-make-a-symlinked-folder-appear-as-a-normal-folder

Temel olarak, sembolik bağlantıların referansını kaldırmak ve sonucu docker yapısına beslemek için tar kullanmayı önerir:

$ tar -czh . | docker build -

Ben 2 hataları alıyorum: tar: Failed to clean up compressor,Error response from daemon: the Dockerfile (Dockerfile) cannot be empty
Ivan Rubinson

3

simlink kullanmak yerine, sadece simlinks kopyalamak veya yapmak yerine dosyaları sites_available konumundan sites_enabled konumuna taşıyarak sorunu yönetimsel olarak çözmek mümkündür

bu nedenle site yapılandırmanız, durdurulmuşsa veya başka bir şey varsa, yalnızca site_available klasöründe veya kullanılması gerekiyorsa sites_enabled'da tek bir kopya halinde olacaktır.


1

Docker yapısının taşınabilirliğini bozduğunu biliyorum, ancak sembolik yerine sabit bağlantılar kullanabilirsiniz:

ln /some/file ./hardlink

4
Açık olmak gerekirse, bu dizinler için değil dosyalar için işe yarar.
GDorn
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.