Не вдалося створити образ докера для COPY не вдалося: помилка stat / var / lib / docker / tmp / docker-builder


87

Я хочу створити образ докера. Це мій робочий каталог: Dockerfile.in test.json test.py

І це мій файл Docker:

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

RUN python test.py

Коли я запускаю цю команду: docker build -f Dockerfile.in -t 637268723/test:1.0 .

Це видає мені цю помилку:

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

Хто-небудь може мені допомогти?


12
Чи є test.py або * .py у вашому dockerignore?
Jay Dorsey

3
Чи доступний test.py у поточному каталозі, куди Докер подав вихід.
Jinna Balu

5
Ви коли-небудь вирішували це? З тією ж проблемою.
emmdee

2
Докер все ще представляє помилкову поведінку на своєму двигуні, імхо. Я використовував те саме COPYтвердження у своєму Dockerfile і мав ті самі проблеми. Спробував COPY /host_file /container_folder(без крапки), і це спрацювало. Після цього спробував перше, COPYщо у вас тут, і воно працювало нормально (wtf?)! Одне, що я зробив іншим, - це видалити всі зображення (кеш), які Docker створює в процесі збірки. Я припускаю, що на цих посередницьких зображеннях все ще може зберігатися сміття (я використовую Docker 18.09.5). Погляньте на SO або GitHub, ТАК БАГАТО проблем щодо 'копіювання контейнера -> хост ->. Погана прикмета.
ivanleoncz

1
Нічого собі, ivanleoncz дякую, я вирішив цю проблему. У мене був такий пункт: ДОДАТИ mcint_swagger_hub-1.0.0.jar /opt/jboss/wildfly/standalone/deployments/mcint_swagger_hub_api-1.0.0.jar, і я проставив косу риску перед mcint_swagger_hub-1.0.0.jar, тому зараз я отримав це: ADD /mcint_swagger_hub-1.0.0.jar /opt/jboss/wildfly/standalone/deployments/mcint_swagger_hub_api-1.0.0.jar, і я не маю проблем. Дякую, брате !! Бог вас благословить
Річард Ребеко

Відповіді:


51

Ви повинні помістити ці файли в один каталог з Dockerfile.


Оскільки я використовував 'from python: 2.7-onbuild', він все одно скопіював усі братські та дочірні файли з розташування Dockerfile. Отже, я нарешті видалив рядки КОПІЮВАННЯ з Dockerfile, і файли, які є як братські файли, також скопіювались.
Куба

2
Якщо це не працює, перевірте свій .dockerignoreфайл!
Кенні Евітт,

Це спрацювало для мене.
cnu

42

Перевірте, чи є .dockerignoreфайл, якщо є, додайте:

!mydir/test.json
!mydir/test.py

2
Цей працював у мене, вся папка була проігнорована, тоді докер не зміг створити зображення, що створило погане враження, що зводило мене з розуму з приводу шляхів до файлів.
Марко Медрано,

Це спрацювало і на мене. У моєму випадку папка, на яку я посилався, знаходилась у .dockerignore, тому її видалили.
Дурга П. Капа

11
  1. Q1: Перевірте свій .dockerignoreфайл у шляху збірки, файли або каталог, які ви хочете скопіювати, можуть бути у списку ігнорованих файлів!
  2. Q2: Директива COPY базується на контексті, в якому ви створюєте образ, тому майте на увазі будь-які проблеми з каталогом, де ви зараз будуєте образ! Див .: https://docs.docker.com/engine/reference/builder/#copy

.dockerignore - основна причина моєї проблеми!
Мін Чжу


4

Я теж стикався з тим самим, я перемістив свій файл докера в рут проекту. тоді це спрацювало


4

Мені довелося використати таку команду для запуску збірки:

docker build .


2

У вашому випадку видалення ./ має вирішити проблему. У мене був інший випадок, коли я використовував каталог з батьківського каталогу, і docker може отримати доступ лише до файлів, що знаходяться під каталогом, де присутній Dockerfile тому якщо у мене є структура каталогів / root / dir та Dockerfile / root / dir / Dockerfile

Я не можу скопіювати, роблю наступне

COPY root/src /opt/src

1
Моя власна проблема була трохи іншою, але проблема "Docker" з непарними шляхами при посиланні на файл над папкою, що містить Dockerfile, була проблемою ДЯКУЄМО ! [Windows 10 + Powershell].
RichW

1

Це може допомогти іншому, хто стикається з подібною проблемою.

Замість того, щоб розміщувати файл у тому самому каталозі, що і файл Docker, створіть директорію та розмістіть файл для копіювання, а потім спробуйте.

COPY mydir/test.json /home/test.json
COPY mydir/test.json /home/test.json

Це помилка? Хтось зрозумів, чому це працює? Це єдине, що допомогло
Еліас Дапшаускас

1

Інша потенційна причина полягає в тому, що докер за замовчуванням не буде переходити за символічними посиланнями (тобто не використовувати ln -s).


1

У моєму випадку це був рядок коментаря, який зіпсував команду COPY

Я видалив коментар після команди COPY і розмістив його у виділеному рядку над командою. На диво це вирішило проблему.

Несправна команда Dockerfile

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

Робоча команда Dockerfile

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

Сподіваюся, це комусь допомагає.


1

Переконайтесь, що контекст, з яким ви будуєте своє зображення, встановлений правильно. Ви можете встановити контекст під час побудови як аргумент. Приклад: docker build -f ./Dockerfile ..де '..' - контекст у цьому прикладі.


0

При використанні Docker складати файли, публікувати, публікувати в obj / Docker / Publish. Коли я скопіював свої файли туди і направив свій файл Dockerfile в цей каталог (як створений), це працює ...


0

Докер шукає файл у поточному каталозі, тобто якщо ваша команда

COPY target / xyz.jar app.jar

ДОДАТИ цільовий / xyz.jar app.jar

Jar xyz повинен знаходитись у поточному / цільовому каталозі - тут поточним є місце, де у вас є ваш файл докера. Отже, якщо у вас докер в іншому каталозі. його краще перенести в основний каталог проекту і мати прямий шлях до банки, яка додається або копіюється на зображення.


0

У мене була та ж проблема з файлом .tgz.

Йшлося лише про місцезнаходження файлу. Переконайтеся, що файл знаходиться в тому ж каталозі файлу Docker.

Також переконайтеся, що каталог файлів .dockerignore не виключає шаблон регулярного виразу файлу.


0

У моєму випадку мені довелося розмістити всі файли проектів у підкаталозі

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

Потім я скопіював файли по-своєму

COPY app ./

-1

Ось причина, чому це трапляється, тобто ваш локальний каталог у хост-ОС, де ви запускаєте докер, повинен мати файл, інакше ви отримаєте цю помилку

Одним із рішень є: використання RUN cp <src> <dst> замість COPY <src> <dst>

потім запустіть команду, яка працює!


1
Привіт, Нішант! Було б гідно висловити своє рішення більш детально. Копіювати файли з хосту в контейнер - все ще щось складне в Docker. Надайте приклади, щоб уточнити свою відповідь. З повагою :)
ivanleoncz

-1

Наступна структура в docker-compose.yaml дозволить вам мати файл Docker у підпапці з кореня:

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

Потім у вашому файлі Docker, який знаходиться в тому ж каталозі, що і docker-compose.yaml, ви можете зробити наступне:

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}

Потім ви можете запустити docker-compose з батьківського каталогу, наприклад:

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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.