Nie można utworzyć obrazu Dockera dla COPY nie powiodło się: błąd stat / var / lib / docker / tmp / docker-builder

87

Chcę utworzyć obraz Dockera. To jest mój katalog roboczy: Dockerfile.in test.json test.py

A to jest mój plik Dockerfile:

COPY ./test.json /home/test.json
COPY ./test.py /home/test.py

RUN python test.py

Kiedy uruchamiam to polecenie: docker build -f Dockerfile.in -t 637268723/test:1.0 .

Daje mi ten błąd:

`Step 1/5 : COPY ./test.json /home/test.json
 ---> Using cache
 ---> 6774cd225d60
 Step 2/5 : COPY ./test.py /home/test.py
 COPY failed: stat /var/lib/docker/tmp/docker-builder428014112/test.py: 
 no such file or directory`

Czy ktoś może mi pomóc?

EdoBen
źródło
12
Czy w Twoim dockerignore znajduje się test.py lub * .py?
Jay Dorsey
3
Czy test.py jest dostępny w bieżącym katalogu, w którym Docker zapisał wyjścia.
Jinna Balu
5
Czy kiedykolwiek to rozwiązałeś? Mając ten sam problem.
emmdee
2
Docker nadal prezentuje błędne zachowanie na swoim silniku, imho. Użyłem tego samego COPYoświadczenia w moim pliku Dockerfile i miałem te same problemy. Próbowałem COPY /host_file /container_folder(bez kropki) i zadziałało. Potem wypróbowałem ten pierwszy COPY, który masz tutaj i działał normalnie (wtf?)! Jedyną rzeczą, którą zrobiłem, było usunięcie wszystkich obrazów (pamięci podręcznej), które Docker generuje w procesie kompilacji. Domyślam się, że na tych pośrednich obrazach nadal mogą znajdować się śmieci (używam Dockera 18.09.5). Spójrz na SO lub GitHub, TAK WIELE problemów dotyczących kopiowania hosta -> kontenera. Zły znak.
ivanleoncz
1
Wow stary, ivanleoncz dziękuję rozwiązałem ten problem. Miałem taką klauzulę: DODAJ mcint_swagger_hub-1.0.0.jar /opt/jboss/wildfly/standalone/deployments/mcint_swagger_hub_api-1.0.0.jar i umieściłem prosty ukośnik przed mcint_swagger_hub-1.0.0.jar, więc teraz i mam to: ADD /mcint_swagger_hub-1.0.0.jar /opt/jboss/wildfly/standalone/deployments/mcint_swagger_hub_api-1.0.0.jar i nie mam problemu. Dzięki stary!! Niech cię Bóg błogosławi
Richard Rebeco,

Odpowiedzi:

52

Powinieneś umieścić te pliki w tym samym katalogu z Dockerfile.

Ivan Lee
źródło
Ponieważ używałem „from python: 2.7-onbuild”, i tak skopiowałem wszystkie pliki rodzeństwa i potomne z lokalizacji Dockerfile. Więc w końcu usunąłem wiersze COPY z Dockerfile, a pliki będące plikami rodzeńskimi również zostały skopiowane.
Kuba
2
Jeśli to nie zadziała, sprawdź swój .dockerignoreplik!
Kenny Evitt
To zadziałało dla mnie.
cnu
42

Sprawdź, czy istnieje .dockerignoreplik, jeśli tak, dodaj:

!mydir/test.json
!mydir/test.py
Brahimi boubakeur
źródło
2
Ten zadziałał dla mnie, cały folder został zignorowany, a następnie dockerowi nie udało się utworzyć obrazu, co sprawiało złe wrażenie, doprowadzając mnie do szału na temat ścieżek plików.
Marco Medrano
To zadziałało również dla mnie. W moim przypadku folder, do którego się odnosiłem, był w .dockerignore, więc został z niego usunięty.
Durga P. Kapa
11
  1. P1: Sprawdź .dockerignoreplik w ścieżce kompilacji, pliki lub katalog, który chcesz skopiować, mogą znajdować się na liście plików ignorowanych!
  2. P2: Dyrektywa COPY jest oparta na kontekście, w którym tworzysz obraz, więc bądź świadomy wszelkich problemów z katalogiem, w którym obecnie budujesz obraz! Zobacz: https://docs.docker.com/engine/reference/builder/#copy
lupguo
źródło
.dockerignore jest główną przyczyną mojego problemu!
Ming Zhu
7

Usunięcie ./ze ścieżki źródłowej powinno rozwiązać problem:

 COPY test.json /home/test.json
 COPY test.py /home/test.py
Daniel Rogatchevsky
źródło
4
w przypadku, gdy
wstawię je do docker
@Mugen cieszę się, że mój komentarz uratował Ci życie;)
Adiii
1
@Adiii też uratowałeś mi życie.
MonkeySeeMonkeyDo
4

Miałem to samo, przeniosłem plik Dockera do katalogu głównego projektu. wtedy zadziałało

Kumar Abhishek
źródło
4

Musiałem użyć następującego polecenia, aby rozpocząć kompilację:

docker build .

Tadej
źródło
2

W twoim przypadku usunięcie ./ powinno rozwiązać problem. Miałem inny przypadek, w którym korzystałem z katalogu z katalogu nadrzędnego, a docker może uzyskać dostęp tylko do plików znajdujących się poniżej katalogu, w którym znajduje się plik Dockerfile, więc jeśli mam strukturę katalogów / root / dir i Dockerfile / root / dir / Dockerfile

Nie mogę skopiować, wykonaj następujące czynności

COPY root/src /opt/src
Ankit Marothi
źródło
1
Mój własny problem był trochę inny, ale "problem" Dockera z dziwnymi ścieżkami podczas odwoływania się do pliku powyżej folderu zawierającego Dockerfile był problemem. DZIĘKUJEMY ! [Windows 10 + Powershell].
RichW,
1

Może to pomóc komuś innemu, który ma podobny problem.

Zamiast umieszczać plik pływający w tym samym katalogu co plik Dockerfile, utwórz katalog i umieść plik do skopiowania, a następnie spróbuj.

COPY mydir/test.json /home/test.json
COPY mydir/test.json /home/test.json
Keyur Vyas
źródło
Czy to błąd? Czy ktoś zorientował się, dlaczego to działa? To była jedyna rzecz, która pomogła
Elijas Dapšauskas
1

Inną potencjalną przyczyną jest to, że docker domyślnie nie podąża za dowiązaniami symbolicznymi (tj. Nie używa ln -s).

Alex
źródło
1

W moim przypadku to wiersz komentarza zakłócał polecenie COPY

Usunąłem komentarz po poleceniu COPY i umieściłem go w dedykowanym wierszu nad poleceniem. Niespodziewanie rozwiązało to problem.

Wadliwe polecenie Dockerfile

COPY qt-downloader .     # https://github.com/engnr/qt-downloader -> contains the script to auto download qt for different architectures and versions

Działające polecenie Dockerfile

# https://github.com/engnr/qt-downloader -> contains the script to auto download qt for different architectures and versions
COPY qt-downloader .     

Mam nadzieję, że to komuś pomoże.

Mohammed Muneer
źródło
1

Upewnij się, że kontekst, w którym tworzysz obraz, jest ustawiony poprawnie. Możesz ustawić kontekst podczas budowania jako argument. Przykład: docker build -f ./Dockerfile ..gdzie „..” jest kontekstem w tym przykładzie.

Kevin
źródło
0

Korzystając z plików redagowania platformy Docker, publikuj, publikuje w obj / Docker / Publish. Kiedy skopiowałem tam moje pliki i wskazałem mój plik Dockerfile do tego katalogu (w postaci wygenerowanej), działa…

Rıfat Erdem Sahin
źródło
0

Sposób, w jaki docker szuka pliku, pochodzi z bieżącego katalogu, tj. Jeśli tak jest

KOPIUJ target / xyz.jar app.jar

DODAJ target / xyz.jar app.jar

Jar xyz powinien znajdować się w katalogu bieżącym / docelowym - tutaj aktualne jest miejsce, w którym masz plik dockera. Więc jeśli masz dockera w innym reż. lepiej przenieść go do głównego katalogu projektu i mieć prostą ścieżkę do pliku jar, który jest dodawany lub kopiowany do obrazu.

Pravin
źródło
0

Miałem ten sam problem z plikiem .tgz.

Chodziło tylko o lokalizację pliku. Upewnij się, że plik znajduje się w tym samym katalogu co plik Dockerfile.

Upewnij się również, że katalog pliku .dockerignore nie wyklucza wzorca pliku regularnego.

Abdurrahman Adebiyi
źródło
0

W moim przypadku musiałem umieścić wszystkie pliki projektu w podkatalogu

app -|inside app directory we have the following
     | package.js
     | src 
     | assets
Dockerfile

Potem skopiowałem pliki na jego sposób

COPY app ./
Ntiyiso Rikhotso
źródło
0

Miałem taki błąd podczas próby zbudowania obrazu Dockera i wypchnięcia do rejestru kontenerów. W moim pliku Dockera próbowałem skopiować plik jar z folderu docelowego i spróbować go uruchomić za pomocą polecenia java -jar.

Rozwiązałem problem, usuwając plik .jar i folder docelowy z pliku .gitignore.

Kaleab
źródło
-1

Oto powód, dla którego tak się dzieje, tj. Twój lokalny katalog w systemie operacyjnym hosta, na którym uruchamiasz docker, powinien mieć plik, w przeciwnym razie otrzymasz ten błąd

Jednym z rozwiązań jest: użyj RUN cp <src> <dst>zamiast COPY <src> <dst>

następnie uruchom polecenie, które działa!

Nishant Mishra
źródło
1
Cześć, Nishant! Warto byłoby przedstawić swoje rozwiązanie bardziej szczegółowo. Kopiowanie plików z hosta do kontenera jest nadal czymś trudnym w Dockerze. Proszę podać przykłady, aby wyjaśnić swoją odpowiedź. Pozdrawiam :)
ivanleoncz
-1

Poniższa struktura w docker-compose.yaml pozwoli ci mieć plik Dockerfile w podfolderze z katalogu głównego:

version: '3'
services:
  db:
    image: postgres:11
    environment:
      - PGDATA=/var/lib/postgresql/data/pgdata
    volumes:
      - postgres-data:/var/lib/postgresql/data
    ports:
      - 127.0.0.1:5432:5432
  **web:
    build: 
      context: ".."
      dockerfile: dockerfiles/Dockerfile**
    command: ...
...

Następnie w pliku Dockerfile, który znajduje się w tym samym katalogu co plik docker-compose.yaml, możesz wykonać następujące czynności:

ENV APP_HOME /home

RUN mkdir -p ${APP_HOME}

# Copy the file to the directory in the container
COPY test.json ${APP_HOME}/test.json
COPY test.py ${APP_HOME}/test.py

# Browse to that directory created above
WORKDIR ${APP_HOME}

Następnie możesz uruchomić docker-compose z katalogu nadrzędnego, na przykład:

docker-compose -f .\dockerfiles\docker-compose.yaml build --no-cache
gagneet
źródło
-7
 <plugin>
    <groupId>io.fabric8</groupId>

    <artifactId>docker-maven-plugin</artifactId>
    <configuration>
      <images>
        <image>
          <name>imagenam</name>
          <alias>dockerfile</alias>
          <build>
            <!-- filter>@</filter-->
            <dockerFileDir>dockerfile loaction</dockerFileDir>
            <tags>
            <tag>latest</tag>
            <tag>0.0.1</tag>
            </tags>
          </build>
          <run>
            <ports>
              <port>8080:8080</port>
            </ports>
          </run>
        </image>
      </images>
    </configuration>
  </plugin>
Satish Koppisetty
źródło