В моем Dockerfile у меня есть следующее выражение «COPY»:
# Copy app code
COPY /srv/visitor /srv/visitor
Само собой разумеется, что в моей хост-системе, в каталоге "/ srv / visitor", действительно есть мой исходный код:
[root@V12 visitor]# ls /srv/visitor/
Dockerfile package.json visitor.js
Теперь, когда я пытаюсь создать образ с помощью этого Dockerfile, он зависает на этапе, когда должно произойти «COPY»:
Step 10 : COPY /srv/visitor /srv/visitor
INFO[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 ae5e2a993e11
npm ERR! install Couldn't read dependencies
npm ERR! Linux 3.18.5-1-ARCH
npm ERR! argv "/usr/bin/node" "/usr/sbin/npm" "install"
npm ERR! node v0.10.36
npm ERR! npm v2.5.0
npm ERR! path /package.json
npm ERR! code ENOPACKAGEJSON
npm ERR! errno 34
npm 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.log
INFO[0171] The command [/bin/sh -c npm install] returned a non-zero code: 34
Итак, была ли выполнена копия? Если да, то почему npm не может найти package.json?
Ответы:
Из документации:
Когда вы используете,
/srv/visitor
вы используете абсолютный путь вне контекста сборки, даже если это на самом деле текущий каталог.Вам лучше организовать контекст сборки следующим образом:
И использовать:
Заметка:
docker build - < Dockerfile
не имеет никакого контекста.Следовательно, используйте,
docker build .
источник
/srv/visitor
директории.RUN cd
но используйте,WORKDIR
чтобы текущий каталог запоминался между каждым шагом. Dockerfile - это не более чем оболочка для docker run + docker commit, поэтому каждый шаг выполняется независимо от предыдущего уровня. Это означает, что pwd равен/
на каждом шаге, если вы не используете эту директиву.Для меня каталог был в правильном контексте, только он был включен в (скрытый)
.dockerignore
файл в корне проекта. Это приводит к сообщению об ошибке:источник
.dockerignore
? что только что случилось со мной!path/to/my/file
даже если онpath
находится в.dockerignore
.Для меня проблема заключалась в том, что я использовал
docker build - < Dockerfile
Из документации Примечание: если вы строите с использованием STDIN (
docker build - < somefile
), контекст компоновки отсутствует, поэтому COPY использовать нельзя.источник
Как сказал ответ Ксавье Лукаса [чрезвычайно полезный], вы не можете использовать COPY или ADD из каталога вне контекста сборки (папка, из которой вы запускаете «сборку докера», должна быть той же директорией, что и ваш .Dockerfile). Даже если вы попытаетесь использовать символическую ссылку, она не будет работать.
Это помогло мне. cp -al копирует структуру каталогов и создает жесткие ссылки для всех файлов. Когда вы закончите, запустите «rm -rf ./src_directory», чтобы удалить его.
источник
Я столкнулся с этой проблемой и обнаружил, что смог добавить контекст в переменную сборки, чтобы загрузить свои файлы Dockerfile из других каталогов. Это позволило мне немного изменить мою файловую структуру Docker по умолчанию. Вот фрагмент моего docker-compose.yml:
Добавив контекст, я смог определить, куда следует ссылаться на файлы. Вы можете ссылаться на документы Docker здесь: https://docs.docker.com/compose/compose-file/#context
Надеюсь это поможет!
источник
Для меня проблема заключалась в том, что имя файла, которое я добавлял, было завершающим. Переименование исправило это.
источник
Для следующей ошибки,
Я получил его, перезапустив докер-сервис.
источник
Я наконец решил эту проблему, в моем случае был Dockerfile, который выполнял копирование на более глубоком уровне проекта. Итак, я понял, что путь сборки хоста выражается относительно расположения файла Dockerfile.
источник
Это случилось со мной при попытке запустить файл докера из другого каталога.
Мне
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
в корневом каталоге приложений, он работал нормально. Это поможет, если вы хотите немного лучше управлять файлами Docker вашей среды.источник
Файл не только должен находиться в каталоге в текущем контексте сборки, но и файл не может быть мягкой ссылкой на файл вне контекста сборки.
У меня была ссылка на файл в моем домашнем каталоге, а ссылка была в каталоге проекта. После того, как я удалил ссылку и переместил связанный файл в проект (
rm mylink ; mv ~/myrealfile ./
), он заработал.источник
Для меня это была проблема с Google Cloud SDK:
https://code.google.com/p/google-cloud-sdk/issues/detail?id=1431
источник