Docker: dodawanie pliku z katalogu nadrzędnego

186

W moim Dockerfilemam:

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

Ten plik istnieje, ponieważ ls ../../myapp.warzwraca mi prawidłowy plik, ale po uruchomieniu sudo docker build -t myapp .mam:

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

Czy ktoś wie, dlaczego i jak to zrobić poprawnie?

Anthony O.
źródło
2
Niektóre obejścia superuser.com/questions/842642
Günter Zöchbauer

Odpowiedzi:

225

Możesz zbudować plik Dockerfile z katalogu nadrzędnego:

docker build -t <some tag> -f <dir/dir/Dockerfile> .
Boedy
źródło
3
Dziękuję Ci! Działa to dobrze na lokalnym komputerze, ale Docker Hub nie może zbudować obrazu, ponieważ próbuje to zrobić z tego samego katalogu (tbh, dokładnie to, czego można by się normalnie spodziewać). Czy jest jakiś sposób na zrobienie tej samej sztuczki w Docker Hub?
Marcel Hernandez,
Nie żebym o tym wiedział. Możesz przesłać obraz do rejestru zamiast korzystać z automatycznego budowania.
Boedy
2
@ eduncan911 Nie sądzę, aby to było przestarzałe w momencie, gdy piszę komentarz. Od tamtej pory mogli zmienić zdanie? Jeśli się mylę, czy możesz podać link do dokumentacji, w której jest napisane, że jest przestarzała. Dzięki!
omninonsense,
6
-f nie wydaje się być przestarzały zgodnie z dokumentacją -> Określ plik Dockerfile (-f) : docs.docker.com/engine/reference/commandline/build/ ...
Ray
6
@ eduncan911 czy możesz usunąć swój komentarz, ponieważ najwyraźniej nie jest przestarzały? Początkowo pominąłem tę odpowiedź z powodu twojego komentarza.
Chris Anderson,
103

Niestety (jak sądzę ze względów praktycznych i bezpieczeństwa), jeśli chcesz dodać / skopiować zawartość lokalną, musi ona znajdować się w tej samej ścieżce głównej, co plik Dockerfile.

Z dokumentacji :

Ścieżka <src> musi znajdować się w kontekście kompilacji; nie możesz DODAĆ ../ coś / coś, ponieważ pierwszym krokiem budowania dockera jest wysłanie katalogu kontekstu (i podkatalogów) do demona dockera.

EDYCJA: Istnieje teraz opcja ( -f) do ustawienia ścieżki do pliku Dockerfile; można go użyć do osiągnięcia tego, co chcesz, zobacz odpowiedź @Boedy poniżej.

mbarthelemy
źródło
22
Czy istnieje „czyste” obejście tego problemu? Wolałbym nie przebudowywać całego katalogu projektu tylko po to, aby to uwzględnić.
ben_frankly
Jak powiedział @ Günter, istnieje obejście tutaj superuser.com/a/842690/136024… czy to naprawdę jest „czyste”? Przynajmniej jest to „obejście” :)
Anthony O.
2
Zobacz lepszą odpowiedź od @Boedy stackoverflow.com/a/34300129/2950621
nmgeek
103

Za pomocą docker-compose można ustawić folder kontekstowy:

#docker-compose.yml
version: '3.3'    
services:
      yourservice:
        build:
          context: ./
          dockerfile: ./docker/yourservice/Dockerfile
Nikita Kuznetsov
źródło
9

Dodanie fragmentów kodu w celu wsparcia zaakceptowanej odpowiedzi.

Struktura katalogów:

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

Wpis pliku Dockera:

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/

Polecenie użyte do zbudowania obrazu dockera

docker build -t test:latest -f setup/docker/Dockerfile .
Binita Bharati
źródło
świetne podejście. Czy można też udostępnić kod install_x.sh?
Ariful Haque
4

Rozwiązaniem dla tych, którzy używają kompozytora, jest użycie woluminu wskazującego na folder nadrzędny:

#docker-composer.yml

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

Ale jestem prawie pewien, że można to zrobić grając z woluminami w Dockerfile .

wikier
źródło
3
Nie może. Uwaga: katalog hosta jest z natury zależny od hosta. Z tego powodu nie można zamontować katalogu hosta z Dockerfile, ponieważ skompilowane obrazy powinny być przenośne.Katalog hostów nie byłby dostępny na wszystkich potencjalnych hostach. docs.docker.com/engine/tutorials/dockervolumes/…
Peeter Kokk
4

Ponieważ -fspowodowałem inny problem, opracowałem inne rozwiązanie.

  • Utwórz obraz podstawowy w folderze nadrzędnym
  • Dodano wymagane pliki.
  • Użyto tego obrazu jako obrazu podstawowego dla projektu, który znajduje się w folderze podrzędnym.

-fFlaga nie rozwiązuje mojego problemu ponieważ moim onbuildwyglądzie obrazu dla pliku w folderze i musiałem zadzwonić tak:

-f foo/bar/Dockerfile foo/bar

zamiast

-f foo/bar/Dockerfile .

Należy również pamiętać, że jest to rozwiązanie tylko w niektórych przypadkach jako -fflaga

guneysus
źródło