Подтвердить что ты не робот

КОПИРОВАТЬ файл в файле Docker, нет такого файла или каталога?

У меня есть Dockerfile, установленный в моей корневой папке (~). Первые три строки моего файла выглядят следующим образом:

COPY file1 /root/folder/
COPY file2 /root/folder/
COPY file3 /root/folder/

но он возвращает следующую ошибку для каждой строки:

Нет такого файла или каталога

Файлы находятся в том же каталоге, что и мой файл Docker, и я запускаю команду docker build - < Dockerfile в том же каталоге в терминале.

Что я здесь делаю неправильно?

4b9b3361

Ответ 1

Инструкция COPY в Dockerfile копирует файлы из src в папку dest. Похоже, вы либо пропустили file1, file2 и file3, либо пытаетесь собрать Dockerfile из неправильной папки.

Обратитесь в Dockerfile Doc

Также команда для сборки Dockerfile должна быть чем-то вроде.

cd into/the/folder/
docker build -t sometagname .

Ответ 2

Также проверьте файл .dockerignore.

Я знаю, что это очень редкий случай, но у меня был этот файл, упомянутый там.

Ответ 3

Возможно, это связано с тем, что вы ссылаетесь на file1/file2/file3 как абсолютный путь, который не находится в контексте построения, Docker только ищет путь в контексте сборки.

например. если вы используете COPY/home/yourname/file1, Docker build интерпретирует его как ${docker build working directory}/home/yourname/file1, если нет файла с таким же именем здесь, не возникает ошибка файла или каталога.

Обратитесь к Одна из проблем докера

Ответ 4

Кажется, что команды:

docker build -t imagename .

и:

docker build -t imagename - < Dockerfile2

не выполняются одинаково. Если вы хотите создать 2 изображения докеров в одной папке с Dockerfile и Dockerfile2, команда COPY не может использоваться во втором примере, используя stdin (< Dockerfile2). Вместо этого вы должны использовать:

docker build -t imagename -f Dockerfile2 .

Затем COPY работает так, как ожидалось.

Ответ 5

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

У меня был COPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directory и удалось решить эту проблему, указав файл докеров.

Работает docker build . -f docker/development/Dockerfile.

Но запуск Running docker build docker/development/Dockerfile` вызвал эту проблему.

-f или --file, чтобы указать имя и расположение Dockerfile.

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

Ответ 6

Я просто испытал эту проблему, и ни одно из предложений здесь не решило мою проблему. Оказывается, у меня были неправильные окончания строк в моем файле, и мне пришлось изменить их на соответствующие окончания строк. (В этом случае от CRLF до LF, поэтому Ubuntu 14.04 распознает скрипт, который я редактировал на окнах.)

Я изменил окончание строки с помощью VSCode, и большинство редакторов кода должны иметь возможность выбора окончаний строки.

Надеюсь, это поможет кому-то.

Ответ 7

Я чувствую себя немного глупо, но моя проблема заключалась в том, что я работал с docker-compose, а мой Dockerfile находился в подкаталоге. /deploy. Ссылка на ADD должна быть относительно корня проекта, а не файла Docker.

Изменен: ADD./file.tar.gz/etc/folder/ чтобы: ADD./deploy/file.tar.gz/etc/folder/

Во всяком случае, я думал, что опубликую, если кто-то столкнется с тем же вопросом.

Ответ 8

Вот решение и лучшая практика:

Вам нужно создать папку ресурсов, в которой вы сможете хранить все свои файлы, которые хотите скопировать.

├── Dockerfile
│   └── resources
│       ├── file1.txt
│       ├── file2.js

Команда для копирования файлов должна быть указана следующим образом:

COPY resources /root/folder/

где

* resources - ваша локальная папка, которую вы создали в той же папке, где находится Dockerfile

*/root/folder/ - папка в вашем контейнере

Ответ 9

При следующей ошибке

COPY failed: stat /<**path**> :no such file or directory

Я получил его, перезапустив службу докеров.

sudo service docker restart

Ответ 10

Ошибка файла с Docker put_archive. Я использую Python API для докеров. Докерная версия 1.12.5, сборка 7392c3b

docker.errors.NotFound: 404 Client Error: Not Found ("lstat /var/lib/docker/aufs/mnt/39d58e00519ba4171815ee4444f3c43d2c6a7e285102747398f6788e39ee0e87/var/lib/neo4j/certificates: no such file or directory")

Я не могу скопировать файлы в созданный контейнер докеров.

con = cli.create_container(...)
cli.put_archive(...)
cli.start(con['Id'])

Если я изменил порядок работы, ошибок нет, и файлы будут скопированы именно так, чтобы я их хотел. Поэтому я знаю, что мой код работает и делает то, что я хочу. Но важно скопировать файлы конфигурации в контейнер до его запуска. Копирование файлов после запуска позволяет контейнеру начать с конфигурации по умолчанию, а не настраиваемой конфигурации, которую необходимо скопировать на место до запуска контейнера. Docker утверждает, что эта проблема закрыта, но она по-прежнему влияет на мое приложение.

Это работает; Тот же код отличается от порядка выполнения.

con = cli.create_container(...)
cli.start(con['Id'])
cli.put_archive(...)

Ответ 11

если вы уверены, что сделали правильные вещи, но докер все еще жалуется, взгляните на эту проблему: https://github.com/moby/moby/issues/27134.
Я был сожжен этим, и, похоже, перезапуск docker engine service docker restart просто исправит эту проблему.

Ответ 12

Я искал исправление по этому вопросу, и папка, в которой я была ADD или COPY'ing, не была в папке сборки, несколько каталогов выше или ссылались на /

Перенос папки из папки сборки в папку сборки исправил мою проблему.

Ответ 13

один из способов не использовать stdin и поддерживать контекст:

1) в вашем файле Dockerfile вы должны добавить

ADD /your_dir_to_copy /location_in_container

2) после, вы должны пойти на родителя /your_dir_to_copy dir

2) затем выполните эту команду

sudo docker build . -t (image/name) -f path_of_your_dockerfile/Dockerfile

3) после создания контейнера

docker run -ti --rm cordova bash

4) После того, как вы скопируете каталог в свой контейнер

Ответ 14

Предыдущие вызовы COPY могут меняться в каталоге.

COPY ./server/package.json ./server      # this passes, but the dest ./server is considered a file

COPY ./server/dist ./server/dist         # error, ./server/dist is not a directory

Добавьте завершающую косую черту к первому вызову

COPY ./server/package.json ./server/

Ответ 15

Я столкнулся с этим. Копирование некоторых каталогов не сработало. Копирование файлов сделал. Оказалось, что файлы, содержащиеся в .gitignore (а не только в .dockerignore), также игнорируются. Видеть: https://github.com/zeit/now/issues/790

Ответ 16

Так произошло это пару раз совсем недавно. Как разработчик .Net, используя VisualStudio, я изменил свое имя сборки с SomeThing на Something в качестве имени DLL, но это не изменит файл .csproj, который остается SomeThing.csproj

Dockerfile использует имена файлов, чувствительные к регистру Linux, поэтому вновь созданный Dockerfile пытался скопировать Something.csproj, который не смог найти. Таким образом, вручную переименовав этот файл (сделав его строчными), все заработало

Но... здесь предостережение. Это изменение имени файла на моем ноутбуке с Windows не воспринимается Git, поэтому источник репо все еще был SomeThing.csproj в репо, и во время процесса CI/CD сборка Docker не удалась по тем же причинам...

Мне пришлось изменить имя файла напрямую, как коммит в репо.... неприятный маленький обходной путь, но заставил меня пойти

tl;dr Если в Windows O/S проверьте чувствительность к регистру имен файлов и учтите, что локальные переименования файлов не воспринимаются при изменении Git, поэтому убедитесь, что репозиторий также изменен при использовании CI/CD