Проблема с КОПИРОВАНИЕМ Docker - "нет такого файла или каталога"

В моем файле Dockerfile у меня есть следующий оператор "КОПИРОВАТЬ":

# Copy app codeCOPY /srv/visitor /srv/visitor

Само собой разумеется, что в моей хост-системе, в каталоге "/srv /visitor", действительно есть мой исходный код:

[root@V12 visitor]# ls /srv/visitor/Dockerfile  package.json  visitor.js

Теперь, когда я пытаюсь создать образ с помощью этого файла Dockerfile, он зависает на шаге, когда должно произойти "КОПИРОВАНИЕ":

Step 10 : COPY /srv/visitor /srv/visitorINFO[0155] srv/visitor: no such file or directory

В нем говорится, что такого каталога нет, но он явно есть.

Есть какие-нибудь идеи?

ОБНОВЛЕНИЕ 1:

Мне было указано, что я ошибался в том, как я понимал контекст сборки. Предложение сводилось к изменению инструкции "КОПИРОВАТЬ" на эту:

COPY . /srv/visitor

Проблема в том, что у меня все было именно так, и процесс сборки остановился на самом следующем шаге:

RUN npm install

В нем говорилось что-то вроде "файл package.json не найден", хотя он явно есть.

ОБНОВЛЕНИЕ 2:

Я попытался запустить его с этим изменением в файле Dockerfile:

COPY source /srv/visitor/

Он остановился при попытке запустить npm:

Step 12 : RUN npm install ---> Running in ae5e2a993e11npm ERR! install Couldn't read dependenciesnpm ERR! Linux 3.18.5-1-ARCHnpm ERR! argv "/usr/bin/node" "/usr/sbin/npm" "install"npm ERR! node v0.10.36npm ERR! npm  v2.5.0npm ERR! path /package.jsonnpm ERR! code ENOPACKAGEJSONnpm ERR! errno 34npm ERR! package.json ENOENT, open '/package.json'npm ERR! package.json This is most likely not a problem with npm itself.npm ERR! package.json npm can't find a package.json file in your current directory.npm ERR! Please include the following file with any support request:npm ERR!     /npm-debug.logINFO[0171] The command [/bin/sh -c npm install] returned a non-zero code: 34

Итак, была ли выполнена копия? Если да, то почему npm не может найти package.json?

Для меня каталог был в правильном контексте, только он был включен в (скрытый) .dockerignore файл в корне проекта. Это приводит к появлению сообщения об ошибке:

lstat mydir/myfile.ext: no such file or directory

Из документации :

То <src> путь должно быть внутри контекста сборки; вы не можете СКОПИРОВАТЬ ../something /something, потому что первым шагом сборки docker является отправка контекстного каталога (и подкаталогов) демону docker.

Когда вы используете /srv/visitor вы используете абсолютный путь вне контекста сборки, даже если на самом деле это текущий каталог.

Вам лучше организовать свой контекст сборки следующим образом :

├── /srv/visitor│   ├── Dockerfile│   └── resources│       ├── visitor.json│       ├── visitor.js

И использовать :

COPY resources /srv/visitor/

Примечание:

docker build - < Dockerfile не имеет никакого контекста.

Следовательно, используйте,

docker build .

Для меня проблема заключалась в том, что я использовал docker build - < Dockerfile

Из документацияПримечание: Если вы создаете с использованием STDIN (docker build - < somefile), нет контекста сборки, поэтому КОПИРОВАТЬ нельзя использовать.

Я столкнулся с этой проблемой и обнаружил, что смог добавить контекст в переменную сборки, чтобы загрузить мои файлы Dockerfile (ов) из других каталогов. Это позволило мне немного изменить файловую структуру Docker по умолчанию по своему вкусу. Вот фрагмент из моего docker-compose.yml:

version: '3'services:  webserver:    build:      context: .      dockerfile: ./server/Dockerfile    ...

Добавив контекст, я смог определить, где следует ссылаться на файлы. Вы можете сослаться на документы Docker здесь: https://docs.docker.com/compose/compose-file/#context

Надеюсь, это поможет!

Как заявил Ксавьер Лукас [чрезвычайно полезный] ответ, вы не можете использовать КОПИРОВАНИЕ или ДОБАВЛЕНИЕ из каталога вне контекста вашей сборки (папка, из которой вы запускаете "docker build", должна быть той же директорией, что и ваша .Dockerfile). Даже если вы попытаетесь использовать символическую ссылку, это не сработает.

Примечание: Это относится только к POSIX (Linux, Unix, Mac, возможно, подсистема Linux для Windows). Возможно, вы сможете сделать то же самое в Windows, используя JUNCTION.

cd ~/your_docker_project/cp -al /subfolder/src_directory ./echo "COPY src_directory /subfolder/" >> Dockerfile

Опасность: Использование этого сделает ваш проект docker специфичным для хоста. Вы почти никогда не захотите этого делать! Обращайтесь с ним осторожно.

Приложение: Обучение, эксперименты в среде разработки

Это помогло мне. cp -al копирует структуру каталогов и создает жесткие ссылки для всех файлов. Когда вы закончите, запустите "rm -rf ./src_directory", чтобы удалить его.

Для следующей ошибки,

COPY failed: stat

Я справился с этим, перезапустив службу docker.

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

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

Бегущий docker build . -f docker/development/Dockerfile работал.

Но бегущий Runningdocker build docker/development/Dockerfile` вызвал эту проблему.

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

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

Для всех, кто заинтересован, .gitignore также может вызвать проблему. В моем случае - пряжа.блокировка была проигнорирована. И это выдало аналогичную ошибку.

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

Для тех, кто ищет проблему в 2017 году - это может быть ваша проблема /var/lib/docker/tmp/docker-builderXXXXXXX/... no such file or directory · Issue #1922 · docker/for-mac · GitHub . он рекомендует удалить вас.файл dockerignore и повторное тестирование. Если это сработает, вы можете изменить свои настройки в .dockerignore, чтобы устранить проблему.