Ошибка команды 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. я получаю следующий след: 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 

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

Ответ 1

Докер не расширяет ~ или $ HOME. Вам, вероятно, нужно явно ссылаться на файл или упаковать его относительно самого файла Docker.

Ответ 2

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

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

Ответ 3

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

Команда docker build создает изображение из файла Docker и контекста. Контекст builds - это файлы в определенном месте PATH. PATH - это каталог вашей локальной файловой системы.

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

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

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

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