2015-01-21 3 views
11

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

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 

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

+0

С MKDIR вы можете использовать опцию -p, чтобы создать их все на одном дыхании: MkDir -p/октава/ЛИЭС/jsonlab – dalore

+0

А также первые 3 линии должны быть объединены в один RUN – dalore

ответ

11

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

+0

РАБОТЫ! Я скопировал файл в тот же каталог, что и файл Docker, и был осторожен с целевой папкой (должен иметь обратную косую черту, но «/.», Поскольку файл назначения не работает). Кажется, что докер очень придирчив к этой операции. –

+1

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

8

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

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

+3

Это было мое дело, я работал над старым проектом, я понял, что у меня есть правило «*» в '.dockerignore', спасибо большое – gsalgadotoledo

3

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

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

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

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

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

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