Как использовать инструкции Docker COPY/ADD для копирования одного файла на изображение
Я пытаюсь скопировать один файл из корня контекста сборки во вновь созданный каталог в образ докеры.
Файл Docker, который я использую, выглядит следующим образом:
FROM debian:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY test.txt /usr/src/app
Файл test.txt представляет собой простой текстовый файл ASCII следующим образом:
$ cat test.txt
This is a test
Однако, когда я создаю это изображение, я получаю изображение, указывающее, что путь назначения не является каталогом.
$ docker build .
Sending build context to Docker daemon 4.608 kB
Sending build context to Docker daemon
Step 0 : FROM debian:latest
---> 9a61b6b1315e
Step 1 : RUN mkdir -p /usr/src/app
---> Using cache
---> 86bd44a8776e
Step 2 : WORKDIR /usr/src/app
---> Using cache
---> ed6771adc681
Step 3 : ADD test.txt /usr/src/app
stat /var/lib/docker/devicemapper/mnt/ee5b9b7029f2adf27d332cbb0d98d6ad9927629a7569fd2d9574cb767b23547b/rootfs/usr/src/app/test.txt: not a directory
Я попытался использовать несколько комбинаций версий докеров, базовых образов и дистрибутивов с установленным докере. Я также пытался использовать ADD вместо COPY, но результат тот же.
В настоящее время я пытаюсь сделать это на CentOS 7 с установленной версией докеры:
Client version: 1.7.1
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 786b29d
OS/Arch (client): linux/amd64
Server version: 1.7.1
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 786b29d
OS/Arch (server): linux/amd64
Я заметил, что я могу скопировать каталог, но не файл. Например, если я создаю "тестовый" каталог в корне контекста построения и поставлю test.txt внутри тестового каталога, то я могу скопировать каталог успешно:
FROM debian:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY test /usr/src/app
Обратите внимание, что в приведенном выше файле Dockerfile я копирую весь каталог. /test, а не только. /test.txt. Эта сборка успешно выполнена.
Документация Docker имеет следующий пример использования для инструкции COPY, которая похожа на то, что я пытаюсь сделать:
COPY hom?.txt /mydir/
Может ли кто-нибудь указать, что я делаю неправильно? Как я могу копировать один файл?
Ответы
Ответ 1
Как указано в документации Dockerfile:
-
Если <src>
- это любой другой файл, он копируется отдельно вместе с его метаданными. В этом случае, если <dest>
заканчивается конечной косой чертой /
, он будет считаться каталогом, а содержимое <src>
будет записано в <dest>/base(<src>)
.
-
Если <dest>
не заканчивается конечной косой чертой, он будет считаться обычным файлом, а содержимое <src>
будет записано в <dest>
.
Таким образом, вы должны написать COPY test.txt /usr/src/app/
с завершающим /
.
Ответ 2
Для меня я добавлял путь на основе docker-compose.yml
вместо Dockerfile
:
Файловая структура
.
..
/docker-compose.yml
/docker/
/docker/php/
/docker/php/Dockerfile
/docker/php/my_file
и в /
я работал с docker-compose up --build
.
вместо COPY docker/php/my_file/some/location
Мне нужно было запустить COPY my_file/some/location