Mam plik Dockerfile skonfigurowany w moim folderze głównym (~). Pierwsze trzy wiersze mojego pliku wyglądają następująco:
COPY file1 /root/folder/
COPY file2 /root/folder/
COPY file3 /root/folder/
ale zwraca następujący błąd dla każdej linii:
Nie ma takiego pliku lub katalogu
Pliki znajdują się w tym samym katalogu co mój plik Dockerfile i uruchamiam polecenie również docker build - < Dockerfile
w tym samym katalogu w terminalu.
Co ja tu robię źle?
Odpowiedzi:
Instrukcja COPY
Dockerfile
kopiuje plikisrc
dodest
folderu. Wygląda na to, są albo brakujefile1
,file2
ifile3
czy staramy się budowaćDockerfile
z niewłaściwym folderze.Odnieś się do Dockerfile Doc
Również polecenie budowania
Dockerfile
powinno być podobne.źródło
Sprawdź również
.dockerignore
plik.Wiem, że to bardzo rzadki przypadek, ale wspomniałem tam o tym pliku.
źródło
ripgrep
Zmieniałem nazwę projektu Java (a tym samym katalog artefaktów i kompilacji) i nie przeszukuję plików dotfiles, więc nie widziałem ostatniego nieznośnego odniesienia do starego katalogu.Prawdopodobnie jest to spowodowane tym, że odnosisz plik1 / plik2 / plik3 jako ścieżkę bezwzględną, która nie jest w kontekście kompilacji, Docker przeszukuje ścieżkę tylko w kontekście kompilacji.
Np. Jeśli używasz COPY / home / yourname / file1, Docker build interpretuje to jako $ {docker build work directory} / home / yourname / file1, jeśli nie ma tutaj pliku o tej samej nazwie, nie zostanie zgłoszony żaden błąd pliku lub katalogu.
Zobacz jeden z problemów z dokerem
źródło
ADD
dyrektywą, dziękuję.Wygląda na to, że polecenia:
i:
nie są wykonywane w ten sam sposób. Jeśli chcesz zbudować 2 obrazy Dockera z jednego folderu z Dockerfile i Dockerfile2, nie można użyć polecenia COPY w drugim przykładzie przy użyciu stdin (<Dockerfile2). Zamiast tego musisz użyć:
Wtedy COPY działa zgodnie z oczekiwaniami.
źródło
Uruchomienie
docker build . -f docker/development/Dockerfile
działało, co pozwala na uruchomienie pliku Dockera z określonego katalogu innego niż katalog główny aplikacji.Użyj
-f
lub,--file
aby określić nazwę i lokalizacjęDockerfile
.Zdarzyło mi się to podczas próby uruchomienia pliku Dockera z innego katalogu.
miałem
COPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directory
i udało mi się rozwiązać ten problem, określając plik dockera.To było
docker build docker/development/Dockerfile
spowodowało ten problem dla mnie.Na początku wydało mi się to dziwne, ponieważ kiedy miałem
Dockerfile
w katalogu głównym aplikacji, działało dobrze. Pomoże to, jeśli chcesz trochę lepiej zarządzać plikami dockera środowiska.źródło
docker build . -f docker/development/Dockerfile
to działaWłaśnie doświadczyłem tego problemu i żadna z poniższych sugestii nie rozwiązała mojego problemu. Okazało się, że w moim pliku były niewłaściwe zakończenia linii i musiałem je zmienić na odpowiednie zakończenia linii. (W tym przypadku z CRLF do LF, więc Ubuntu 14.04 rozpoznałby skrypt, który edytowałem w systemie Windows).
Zmieniłem zakończenia linii za pomocą VSCode, a większość edytorów kodu powinna mieć możliwość wyboru końcówek linii.
Mam nadzieję, że to komuś pomoże.
źródło
Czuję się trochę głupio, ale moim problemem było to, że korzystałem z docker-compose, a mój plik Dockerfile był w podkatalogu ./deploy. Moje odniesienie ADD musiało być względne w stosunku do katalogu głównego projektu, a nie do pliku Dockerfile.
Zmieniono: ADD ./file.tar.gz / etc / folder / na: ADD ./deploy/file.tar.gz / etc / folder /
W każdym razie pomyślałem, że napiszę na wypadek, gdyby ktoś napotkał ten sam problem.
źródło
Oto rozwiązanie i najlepsze praktyki:
Musisz utworzyć folder zasobów, w którym możesz przechowywać wszystkie pliki, które chcesz skopiować.
Polecenie do kopiowania plików należy podać w ten sposób:
gdzie
* zasoby - folder lokalny, który utworzyłeś w tym samym folderze, w którym znajduje się plik Dockerfile
* / root / folder / - folder w Twoim kontenerze
źródło
W przypadku następującego błędu
Zrobiłem to, ponownie uruchamiając usługę Dockera.
źródło
File not found error with Docker put_archive. Używam interfejsu API Pythona dla platformy Docker. Docker w wersji 1.12.5, kompilacja 7392c3b
Nie mogę skopiować plików do utworzonego kontenera Dockera.
Jeśli zmienię kolejność operacji, nie ma błędu, a pliki są kopiowane dokładnie tam, gdzie chcę. Więc wiem, że mój kod działa i robi to, co chcę. Ale ważne jest, aby skopiować pliki konfiguracyjne do kontenera przed jego uruchomieniem. Kopiowanie plików po uruchomieniu powoduje, że kontener zaczyna się od konfiguracji domyślnej, a nie konfiguracji niestandardowej, którą należy skopiować na miejsce przed uruchomieniem kontenera. Docker twierdzi, że ten problem został zamknięty, ale nadal wpływa na moją aplikację.
To działa; Ten sam kod, inna kolejność wykonania.
źródło
jeśli jesteś pewien, że postąpiłeś dobrze, ale docker nadal narzeka, spójrz na ten problem: https://github.com/moby/moby/issues/27134 .
Spaliłem się przez to i wygląda na to, że ponowne uruchomienie silnika Dockera
service docker restart
po prostu naprawi ten problem.źródło
Szukałem rozwiązania tego problemu, a folder, który dodałem lub kopiowałem, nie znajdował się w folderze kompilacji, w wielu katalogach powyżej lub w katalogu /
Przeniesienie folderu spoza folderu kompilacji do folderu kompilacji rozwiązało mój problem.
źródło
jednym ze sposobów, aby nie używać stdin i zachować kontekstu, jest:
1) w pliku Dockerfile, należy dodać
2) następnie powinieneś przejść do katalogu nadrzędnego / your_dir_to_copy
2), a następnie uruchom to polecenie
3) po utworzeniu kontenera
4) Po skopiowaniu katalogu do kontenera
źródło
Poprzednie wywołania COPY mogły powodować zmianę katalogu.
Dodaj na końcu ukośnik do pierwszego wywołania
źródło
Wpadłem na to. Kopiowanie niektórych katalogów nie działało. Kopiowanie plików tak. Okazało się, że dzieje się tak, ponieważ pliki zawarte w .gitignore (nie tylko .dockerignore) są również ignorowane. Zobacz: https://github.com/zeit/now/issues/790
źródło
.dockerignore
do sprawcyWiem, że to stare, ale coś, na co warto zwrócić uwagę. Jeśli uważasz, że wszystko jest tak, jak powinno, sprawdź swój plik .gitignore :)
Możesz mieć folder lokalnie, ale jeśli folder znajduje się w twoim git zignoruj, nie ma go na serwerze, co oznacza, że Docker nie może znaleźć tego folderu, ponieważ nie istnieje.
źródło
Podobnie i dzięki odpowiedzi tslegaitisa , po
to pokazuje
Sprawdzając ten dziennik, mówi, że docker użyje
.gitignore
:Więc naprawiłem mój
.gitignore
(zamiast tego używam go jako białej listy) i docker skopiował plik.[Dodałem odpowiedź, ponieważ nie mam wystarczającej reputacji, aby komentować]
źródło
Miałem ten problem, mimo że mój katalog źródłowy był w odpowiednim kontekście kompilacji. Okazało się, że powodem było to, że mój katalog źródłowy był symbolicznym dowiązaniem do lokalizacji poza kontekstem kompilacji.
Na przykład mój plik Dockerfile zawiera następujące elementy:
Jeśli
dir1
jest dowiązaniem symbolicznym,COPY
polecenie nie działa w moim przypadku.źródło
Tak więc ostatnio zdarzyło się to kilka razy. Jako programista .Net, używając VisualStudio, zmieniłem nazwę kompilacji z
SomeThing
naSomething
jako nazwę DLL, ale to nie zmienia pliku .csproj, który pozostajeSomeThing.csproj
Plik Dockerfile używa nazw plików w systemie Linux z rozróżnianiem wielkości liter, więc nowo wygenerowany plik Dockerfile próbował skopiować
Something.csproj
czego nie mógł znaleźć. Więc ręczna zmiana nazwy tego pliku (czyniąc go małymi literami) sprawiła, że wszystko działałoAle ... oto ostrzeżenie. Ta zmiana nazwy pliku na moim laptopie z systemem Windows nie jest odbierana przez Git, więc źródło repozytorium nadal znajdowało
SomeThing.csproj
się w repozytorium, a podczas procesu CI / CD kompilacja Dockera nie powiodła się z tych samych powodów ...Musiałem zmienić nazwę pliku bezpośrednio jako zatwierdzenie w repozytorium ... paskudne małe obejście, ale sprawiło, że zacząłem
tl; dr Jeśli w systemie Windows O / S sprawdź rozróżnianie wielkości liter w nazwach plików i pamiętaj, że lokalne zmiany nazw plików nie są pobierane przy zmianie Git, więc upewnij się, że repozytorium jest również zmodyfikowane, jeśli używasz CI / CD
źródło
Kilka świetnych odpowiedzi już tutaj. Pomogło mi przeniesienie komentarzy do następnej linii.
ŹLE :
DOBRY :
źródło