Как использовать инструкции Docker COPY/ADD для копирования одного файла в образ

Я пытаюсь скопировать один файл из корня контекста сборки во вновь созданный каталог в образе докера.

Dockerfile, который я использую, выглядит следующим образом:

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» в корневом каталоге контекста сборки и помещу 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/

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


person Andrew Butler    schedule 26.07.2015    source источник


Ответы (2)


Как указано в документации Dockerfile:

  • Если <src> является файлом любого другого типа, он копируется отдельно вместе со своими метаданными. В этом случае, если <dest> заканчивается косой чертой /, это будет считаться каталогом, а содержимое <src> будет записано в <dest>/base(<src>).

  • Если <dest> не заканчивается косой чертой, он будет считаться обычным файлом, а содержимое <src> будет записано в <dest>.

Таким образом, вы должны написать COPY test.txt /usr/src/app/ с конечным /.

person jwodder    schedule 26.07.2015
comment
Это пахнет rsync. Мне всегда приходится перепроверять это. - person Dave Hodgkinson; 04.07.2018
comment
У меня работало и без замыкающей строки (Docker 18.09.5). COPY по-прежнему сложно (посмотрите все вопросы на SO и GitHub). - person ivanleoncz; 28.04.2019

Для меня я добавлял путь на основе 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

person Steve Tauber    schedule 07.12.2018