Ошибка инструкции Dockerfile COPY?

Все, я пытаюсь постоянно копировать файлы с моего хоста в образ, чтобы эти файлы были доступны с каждым контейнером, запущенным на основе этого образа. Запуск на debian wheezy 64bit в качестве гостя виртуального бокса.

Dockerfile довольно прост (установка образа октавы):

FROM debian:jessie 
MAINTAINER GG_Python <[redacted]@gmail.com>
RUN apt-get update 
RUN apt-get update
RUN apt-get install -y octave octave-image octave-missing-functions octave-nan octave-statistics

RUN mkdir /octave
RUN mkdir /octave/libs
RUN mkdir /octave/libs/jsonlab
COPY ~/octave/jsonlab/loadjson.m /octave/libs/jsonlab/.

Я получаю следующую трассировку после выполнения команды сборки: docker build -t octave .

Sending build context to Docker daemon 423.9 kB
Sending build context to Docker daemon 
Step 0 : FROM debian:jessie
 ---> 58052b122b60
Step 1 : MAINTAINER GG_Python <[..]@gmail.com>
 ---> Using cache
 ---> 90d2dd2f7ee8
Step 2 : RUN apt-get update
 ---> Using cache
 ---> 4c72c25cd829
Step 3 : RUN apt-get update
 ---> Using cache
 ---> b52f0bcb9f86
Step 4 : RUN apt-get install -y octave octave-image octave-missing-functions octave-nan octave-statistics
 ---> Using cache
 ---> f0637ab96d5e
Step 5 : RUN mkdir /octave
 ---> Using cache
 ---> a2d278b2819b
Step 6 : RUN mkdir /octave/libs
 ---> Using cache
 ---> 65efbbe01c99
Step 7 : RUN mkdir /octave/libs/jsonlab
 ---> Using cache
 ---> e41b80901266
Step 8 : COPY ~/octave/jsonlab/loadjson.m /octave/libs/jsonlab/.
INFO[0000] ~/octave/jsonlab/loadjson.m: no such file or directory 

Докер категорически отказывается копировать этот файл с хоста в образ. Излишне говорить, что файл loadjson.m есть (отображает кот), все мои попытки изменить путь (относительный, абсолютный и т. д.) не увенчались успехом. Любые советы, почему эта простая задача проблематична?


person GG_Python    schedule 21.01.2015    source источник
comment
С помощью mkdir вы можете использовать параметр -p, чтобы создать их все за один раз: mkdir -p /octave/libs/jsonlab   -  person dalore    schedule 21.12.2017
comment
А также первые 3 строки нужно объединить в один RUN   -  person dalore    schedule 21.12.2017


Ответы (5)


В то время, когда я писал это, Docker не расширял ~ или $HOME. Теперь он делает некоторые расширения внутри контекста сборки, но даже в этом случае они, вероятно, не то, что вам нужно — они не являются вашим домашним каталогом вне контекста. Вам нужно явно сослаться на файл или упаковать его относительно самого Dockerfile.

person kojiro    schedule 21.01.2015
comment
РАБОТАЕТ! Я скопировал файл в тот же каталог, что и Dockerfile, и был осторожен с папкой назначения (должна быть обратная косая черта, но /., поскольку файл назначения не работает). Похоже, докер очень придирчив к этой операции. - person GG_Python; 21.01.2015
comment
Как ни странно, использование явного пути к исходному файлу у меня не сработало, даже если он находился в том же месте, что и Dockerfile. Я удалил путь к исходному файлу, и это сработало. - person ben; 28.07.2016
comment
Я все время спотыкаюсь об это, Докер, зачем ты искусственно усложняешь нам жизнь? Файл есть, путь правильный, почему не работает? Серьезно, есть масса других реальных проблем, которые нужно решить, зачем реализовывать что-то настолько ужасно подверженное ошибкам? - person Markus Bawidamann; 22.03.2021
comment
Всегда добавляйте WORKDIR перед копией WORKDIR /home/user COPY ./ . - person user3613987; 13.07.2021

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

Когда вы запускаете «сборку докеров», докер тарирует контекст и отправляет его демону докеров, к которому вы подключены. Это позволяет копировать файлы только внутри контекста, потому что демон может быть удаленной машиной.

person Javier Castellanos    schedule 21.01.2015
comment
Это был мой случай, я работал над старым проектом, я понял, что у меня есть правило * в .dockerignore, большое спасибо - person gsalgadotoledo; 03.05.2017
comment
docker ignore только что укусил меня, спасибо за информацию. - person steven87vt; 18.08.2020
comment
Буквально искал 3 часа подряд, и я думал, что схожу с ума, почему он отказывается что-либо копировать. Спасибо! - person Nestroy; 29.05.2021

Я не мог заставить COPY работать, пока не понял контекст (я пытался скопировать файл вне контекста)

Команда сборки docker создает образ из файла Dockerfile и контекста. Контекст сборки — это файлы в указанном месте PATH. PATH — это каталог в вашей локальной файловой системе.

Контекст обрабатывается рекурсивно. Таким образом, PATH включает любые подкаталоги.

Сборка выполняется демоном Docker, а не интерфейсом командной строки. Первое, что делает процесс сборки, это отправляет весь контекст (рекурсивно) демону. В большинстве случаев лучше начать с пустого каталога в качестве контекста и хранить файл Dockerfile в этом каталоге. Добавьте только те файлы, которые необходимы для создания Dockerfile.

Предупреждение. Не используйте корневой каталог / в качестве ПУТИ, так как это приводит к тому, что сборка передает все содержимое вашего жесткого диска демону Docker.

Ссылка: https://docs.docker.com/engine/reference/builder/#usage

person Robert Brooker    schedule 06.05.2017
comment
Я не понимаю, что здесь означает контекст. Нет, он не отправляет весь каталог /, зачем ему это делать? Когда вы создаете образ, он не копирует автоматически все файлы, он копирует те, которые вы явно копируете. В настоящее время я застрял в том, что не могу скопировать ОДИН файл, а тем более. Он всегда выдает сообщение об ошибке, отказываясь выполнять команду копирования в файле докера, что очень расстраивает. - person Markus Bawidamann; 22.03.2021

У меня была аналогичная проблема. Я решил это, проверив две вещи:

  1. Внутри вашей docker-compose.yaml проверки context службы docker не будет копировать файлы за пределы этого каталога. Например, если context равно app/, вы не можете ничего скопировать из ../app.

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

person ashdaily    schedule 17.10.2020

Я заработал, сначала проверив контекст, установив абсолютный путь перед исходным файлом в вашем Dockerfile, чтобы получить эту информацию:

# grep COPY Dockerfile
COPY /path/to/foo   /whatever/path/in/destination/foo

Здание с этим:

docker build -t bar/foo .

вы получите сообщение об ошибке, в котором указан контекстный путь, который Docker, по-видимому, ищет для своих файлов, например. оказывается:

/var/lib/docker/tmp      # I don't remember

Скопируйте (!) свой набор файлов сборки в этот каталог (здесь: /var/lib/docker/tmp), перейдите в него и выполните сборку оттуда.

Посмотрите, сработает ли это, и не забудьте почистить tmp, удалив файлы перед следующим посещением (или).

ХТН

Майкл

person mistige    schedule 03.02.2021