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?


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.


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

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

.dockerignore jest główną przyczyną mojego problemu!
Ming Zhu


4

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


4

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

docker build .


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

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

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).


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.


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.


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…


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.


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.


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 ./

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.


-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!


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

-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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.