Docker: bir üst dizinden dosya ekleme


186

Benim Dockerfilevar:

ADD ../../myapp.war /opt/tomcat7/webapps/

Bu dosya ls ../../myapp.warbana doğru dosyayı döndürür gibi var ama ben çalıştırdığımda sudo docker build -t myapp .var:

Step 1 : ADD ../../myapp.war /opt/tomcat7/webapps/
2014/07/02 19:18:09 ../../myapp.war: no such file or directory

Birisi neden ve nasıl doğru bir şekilde yapılacağını biliyor mu?


Yanıtlar:


225

Dockerfile dosyasını üst dizinden oluşturabilirsiniz:

docker build -t <some tag> -f <dir/dir/Dockerfile> .

3
Teşekkür ederim! Bu, yerel bir kutuda iyi çalışır, ancak Docker Hub, görüntüyü aynı dizinden yapmaya çalıştığından (tbh, normalde beklediği gibi) başarısız olur. Docker Hub'da aynı hile yapmanın bir yolu var mı?
Marcel Hernandez

Bildiğim kadarıyla hayır. Otomatik derleme kullanmak yerine görüntüyü kayıt defterine gönderebilirsiniz.
Mart'ta Boedy

2
@ eduncan911 Yorumumu yazdığım sırada bunun onaylanmadığını sanmıyorum. O zamandan beri fikrini değiştirmiş olabilirler mi? Eğer yanılıyorsam, kullanımdan kaldırıldığını belirten belgelere bağlanabilir misiniz? Teşekkürler!
omninonsense

6
-f gelmez docs başına kullanım dışı gibi görünen -> Bir Dockerfile (-f) belirtin : docs.docker.com/engine/reference/commandline/build/...
Ray

6
@ eduncan911 Görünüşe göre kullanımdan kaldırılmadığı için yorumunuzu silebilir misiniz? Yorumunuz nedeniyle başlangıçta bu cevabı atladım.
Chris Anderson

103

Ne yazık ki, (pratik ve güvenlik nedenleriyle), yerel içerik eklemek / kopyalamak istiyorsanız, bu dosyanın aynı kök yolunun altında olması gerekir Dockerfile.

Gönderen belgeler :

<src> yolu derlemenin bağlamı içinde olmalıdır; Eğer ../something ADD edemez bir liman işçisi yapı ilk adımı liman işçisi daemona bağlam dizini (ve alt dizinleri) göndermek için, çünkü / şey.

DÜZENLE: Artık -fDockerfile dosya yolunu ayarlamak için bir seçenek ( ) var; istediğinizi elde etmek için kullanılabilir, bkz. @Boedy'nin yanıtı.


22
Bunun için "temiz" bir çözüm var mı? Tüm proje dizinimi sadece bunu karşılamak için yeniden yapılandırmak istemem.
ben_frankly

@ Günter tarafından söylendiği gibi burada bir geçici çözüm var superuser.com/a/842690/136024 ... gerçekten "temiz" mi? En azından bir "geçici çözüm" :)
Anthony O.


103

Docker-compose ile bağlam klasörünü ayarlayabilirsiniz:

#docker-compose.yml
version: '3.3'    
services:
      yourservice:
        build:
          context: ./
          dockerfile: ./docker/yourservice/Dockerfile

9

Kabul edilen yanıtı desteklemek için bazı kod snippet'leri ekleme.

Dizin yapısı:

setup/
 |__docker/DockerFile
 |__target/scripts/<myscripts.sh>
src/
 |__<my source files>

Docker dosya girişi:

RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/scripts/
RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/src/
WORKDIR /home/vagrant/dockerws/chatServerInstaller

#Copy all the required files from host's file system to the container file system.
COPY setup/target/scripts/install_x.sh scripts/
COPY setup/target/scripts/install_y.sh scripts/
COPY src/ src/

Liman işçisi görüntüsünü oluşturmak için kullanılan komut

docker build -t test:latest -f setup/docker/Dockerfile .

harika bir yaklaşım. Kodunu da paylaşmak mümkün mü install_x.sh?
Ariful Haque

4

Besteci kullananlar için çözüm , üst klasöre işaret eden bir birim kullanmaktır :

#docker-composer.yml

foo:
  build: foo
  volumes:
    - ./:/src/:ro

Ama eminim ki Dockerfile'daki birimlerle oynayabilirsiniz .


3
Yapamaz. Not: Ana bilgisayar dizini, doğası gereği, ana makineye bağlıdır. Bu nedenle, yerleşik görüntülerin taşınabilir olması gerektiğinden Dockerfile'dan bir ana bilgisayar dizini bağlayamazsınız . Bir ana bilgisayar dizini tüm potansiyel ana bilgisayarlarda kullanılamaz. docs.docker.com/engine/tutorials/dockervolumes/…
Peeter Kokk

4

Yana -fbaşka soruna neden, başka bir çözüm geliştirdi.

  • Üst klasörde temel görüntü oluşturma
  • Gerekli dosyalar eklendi.
  • Bu görüntüyü, alt klasörde yer alan proje için temel görüntü olarak kullandı.

-fBayrak benim çünkü benim sorun çözüldü gelmez onbuildbir klasörde bir dosya için görüntü görünüyor ve böyle aramak zorunda:

-f foo/bar/Dockerfile foo/bar

onun yerine

-f foo/bar/Dockerfile .

Ayrıca, bunun yalnızca -fbayrak gibi bazı durumlarda çözüm olduğunu unutmayın

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.