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


87

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

А это мой Dockerfile:

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
В вашем dockerignore есть test.py или * .py?
Джей Дорси,

3
Доступен ли test.py в текущем каталоге, куда Docker подал файлы exitsts.
Джинна Балу

5
Вы когда-нибудь решали это? Такая же проблема.
emmdee

2
Docker по-прежнему демонстрирует ошибочное поведение на своем движке, imho. Я использовал тот же COPYоператор в своем Dockerfile, и у меня были те же проблемы. Пробовал COPY /host_file /container_folder(без точки), и все получилось. После этого попробовал первый, COPYкоторый у вас есть, и он работал нормально (черт возьми?)! Одна вещь, которую я сделал по-другому, - это удалить все изображения (кеш), которые Docker генерирует в процессе сборки. Я предполагаю, что на этих промежуточных образах все еще может храниться мусор (я использую Docker 18.09.5). Взгляните на SO или GitHub, ТАК МНОГО проблем с копированием host -> container. Плохой знак.
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. Итак, я, наконец, удалил строки COPY из Dockerfile, и файлы, являющиеся файлами-аналогами, тоже были скопированы.
Куба

2
Если это не сработает, проверьте свой .dockerignoreфайл!
Кенни Эвитт,

Это сработало для меня.
cnu

42

Проверьте, есть ли .dockerignoreфайл, если есть, добавьте:

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

2
Этот сработал для меня, вся папка была проигнорирована, затем докеру не удалось создать образ, что произвело плохое впечатление, и я злился на пути к файлам.
Marco Medrano

Это сработало и для меня. В моем случае папка, о которой я говорил, была в .dockerignore, поэтому была удалена из нее.
Дурга П. Капа

11
  1. Q1: проверьте свой .dockerignoreфайл в пути сборки, файлы или каталог, которые вы хотите скопировать, могут быть в списке игнорируемых файлов!
  2. Q2: Директива COPY основана на контексте, в котором вы создаете образ, поэтому будьте в курсе любых проблем с каталогом, в котором вы в настоящее время создаете образ! См. Https://docs.docker.com/engine/reference/builder/#copy

.dockerignore - основная причина моей проблемы!
Мин Чжу

6

Удаление ./из исходного пути должно решить вашу проблему:

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

4
на случай если я положу их в docker ignore о нет: D
Adiii

@Mugen рад, что мой комментарий спас тебе жизнь;)
Adiii

1
@Adiii, ты тоже спас мне жизнь.
MonkeySeeMonkeyDo

4

Я тоже столкнулся с тем же, я переместил свой файл докеров в корень проекта. тогда это сработало


4

Мне пришлось использовать следующую команду, чтобы начать сборку:

docker build .


2

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

Я не могу скопировать, сделайте следующее

COPY root/src /opt/src

1
Моя собственная проблема была немного другой, но проблема Docker с нечетными путями при обращении к файлу над папкой, содержащей Dockerfile, была проблемой СПАСИБО ! [Windows 10 + Powershell].
RichW

1

Это может помочь кому-то другому, столкнувшемуся с аналогичной проблемой.

Вместо того, чтобы помещать файл в тот же каталог, что и Dockerfile, создайте каталог и поместите файл для копирования, а затем попробуйте.

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

Докер ищет файл в текущем каталоге, т.е. если ваша команда

КОПИРОВАТЬ цель / xyz.jar app.jar

ДОБАВИТЬ цель / xyz.jar app.jar

JAR-файл xyz должен находиться в каталоге current / target - здесь current - это место, где у вас находится файл докера. Итак, если у вас есть docker в другом каталоге. его лучше перенести в основной каталог проекта и иметь прямой путь к банке, добавляемой или копируемой в изображение.


0

У меня была такая же проблема с файлом .tgz.

Дело было просто в местонахождении файла. Убедитесь, что файл находится в том же каталоге, что и Dockerfile.

Также убедитесь, что каталог файла .dockerignore не исключает шаблон регулярного выражения файла.


0

В моем случае мне пришлось поместить все мои файлы проекта в подкаталог

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

Потом я скопировал файлы на его лад

COPY app ./

0

У меня была такая ошибка при попытке создать образ докера и отправить его в реестр контейнеров. Внутри моего файла докеров я попытался скопировать файл jar из целевой папки и попытаться выполнить его с помощью команды java -jar.

Я решил проблему, удалив файл .jar и целевую папку из файла .gitignore.


-1

Вот причина, по которой это происходит: ваш локальный каталог в ОС хоста, где вы запускаете докер, должен иметь файл, иначе вы получите эту ошибку

Одно из решений: использовать RUN cp <src> <dst>вместо COPY <src> <dst>

затем запустите команду, она работает!


1
Привет, Нишант! Хотелось бы более подробно изложить свое решение. Копирование файлов с хоста в контейнер по-прежнему остается сложной задачей в Docker. Приведите примеры, чтобы пояснить ответ. С уважением :)
ivanleoncz

-1

Следующая структура в docker-compose.yaml позволит вам иметь файл Dockerfile в подпапке из корня:

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

Затем в вашем Dockerfile, который находится в том же каталоге, что и 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.