Как скопировать файл с хоста в контейнер с помощью Dockerfile

Я написал Dockerfile, который выглядит так

FROM ubuntu:12.04

RUN apt-get update
RUN apt-get install -y wget

Теперь у меня есть файл с именем abc.txt на моем хост-компьютере. Как я могу скопировать его в этот контейнер. Есть ли какой-либо шаг, который я могу добавить в Dockerfile, который копирует с хоста в контейнер.


person Sasikiran Vaddi    schedule 26.05.2015    source источник
comment
кстати, wget уже включен в Ubuntu 12.04, если мне не изменяет память   -  person user2915097    schedule 26.05.2015
comment
Ваше обновление и установка, вероятно, должны быть размещены в одной строке, см. docs.docker.com/ статьи/dockerfile_best-practices/#run   -  person Henrik Karlsson    schedule 26.05.2015
comment
вы хотите, чтобы файл был в docker-образе или просто в docker-контейнере?   -  person Thomasleveil    schedule 26.05.2015


Ответы (7)


Используйте команду COPY следующим образом:

COPY foo.txt /data/foo.txt
# where foo.txt is the relative path on host
# and /data/foo.txt is the absolute path in the image

дополнительные сведения о COPY см. в официальной документации.

Альтернативой может быть использование ADD, но это не лучшая практика, если вы не хотите использовать некоторые расширенные функции ADD, такие как распаковка файлов tar.gz. Если вы все еще хотите использовать команду ADD, сделайте это следующим образом:

ADD abc.txt /data/abc.txt
# where abc.txt is the relative path on host
# and /data/abc.txt is the absolute path in the image

подробнее об ADD читайте в официальной документации.

person george.yord    schedule 29.05.2015
comment
Есть ли возможность сделать это, используя абсолютный путь к хост-компьютеру? - person thenakulchawla; 20.03.2018
comment
К сожалению, нет, вы можете добавлять файлы только из папки вашего Dockerfile или ее подпапок. Также не будут работать софтлинки. Это связано с процессом сборки докера. Сборка начинается со сжатия каталога, в котором находится Dockerfile, в архив и использует этот архив для извлечения файлов, используемых в командах ADD/COPY. - person george.yord; 20.03.2018
comment
спасибо, я написал сценарий оболочки, чтобы автоматизировать эту часть. Было бы лучше, если бы я мог справиться с этим через Dockerfile. - person thenakulchawla; 20.03.2018

Для тех, кто получает эту (ужасно непонятную) ошибку:

Ошибка COPY: stat /var/lib/docker/tmp/docker-builderXXXXXXX/abc.txt: нет такого файла или каталога

Причин может быть масса, в том числе:

  • Для пользователей docker-compose помните, что файл docker-compose.yml context перезаписывает контекст файла Dockerfile. Ваши операторы COPY теперь должны перемещаться по пути относительно того, что определено в docker-compose.yml, а не относительно вашего Dockerfile.
  • Завершающие комментарии или точка с запятой в строке COPY: COPY abc.txt /app #This won't work
  • Файл находится в каталоге, игнорируемом .dockerignore или .gitignore файлами (остерегайтесь подстановочных знаков)
  • Вы сделали опечатку

Иногда WORKDIR /abc, за которым следует COPY . xyz/, работает там, где COPY /abc xyz/ не работает, но это немного некрасиво.

person Overleaf    schedule 24.10.2018
comment
Добавьте к этому - если вы переместите файл Dockerfile в pycharm, он может автоматически изменить контекст. - person Marcel Wilson; 01.10.2019
comment
Ах спасибо! Нашел надоедливую .gitignore, которая мешала ADD foo.zip . в моем Dockerfile. - person hashlock; 13.08.2020
comment
Спасибо! Для меня проблемы были .gitignore - person jrp; 20.11.2020

Я столкнулся с этой проблемой, мне не удалось скопировать каталог zeppelin [1GB] в контейнер докеров, и возникла проблема

Ошибка COPY: stat /var/lib/docker/tmp/docker-builder977188321/zeppelin-0.7.2-bin-all: нет такого файла или каталога

Я использую версию докера: 17.09.0-ce и решил проблему, выполнив следующие действия.

Шаг 1: скопируйте каталог zeppelin [который я хочу скопировать в пакет docker] в каталог, содержащий «Dockfile»

Шаг 2: отредактируйте Dockfile и добавьте команду [место, куда мы хотим скопировать] ADD ./zeppelin-0.7.2-bin-all /usr/local/

Шаг 3: перейдите в каталог, содержащий DockFile, и запустите команду [также доступны альтернативы] docker build

Шаг 4: образ докера создан успешно с журналами

Шаг 5/9: ДОБАВИТЬ ./zeppelin-0.7.2-bin-all /usr/local/ ---> 3691c902d9fe

Шаг 6/9: WORKDIR $ZEPPELIN_HOME ---> 3adacfb024d8 .... Успешно собран b67b9ea09f02

person Rajeev Rathor    schedule 07.12.2017
comment
Важным шагом здесь является тот факт, что файл должен находиться в той же папке, что и Dockerfile. - person bormat; 16.12.2019

Я получил следующую ошибку при использовании Docker 19.03.8 в CentOS 7:

COPY failed: stat /var/lib/docker/tmp/docker-builderXXXXXXX/abc.txt: no such file or directory

Решение для меня заключалось в сборке из файла Docker с docker build . вместо docker build - < Dockerfile.

person Matthias Munz    schedule 16.06.2020

вы можете использовать либо команду ADD https://docs.docker.com/engine/reference/builder/#/add или команду COPY https://docs.docker.com/engine/reference/builder/#/copy

person user2915097    schedule 26.05.2015

Я смог скопировать файл с моего хоста в контейнер в файле докеров как таковой:

  1. Создал папку в моем драйвере c -> c:\docker
  2. Создайте тестовый файл в той же папке --> c:\docker\test.txt
  3. Создайте файл докера в той же папке --> c:\docker\dockerfile
  4. Содержимое файла докера выглядит следующим образом, чтобы скопировать файл с локального хоста в корень контейнера: ИЗ ubuntu: 16.04

    КОПИРОВАТЬ test.txt/

  5. Извлеките копию Ubuntu из концентратора докеров --> docker pull ubuntu: 16.04
  6. Соберите образ из dockerfile --> docker build -t myubuntu c:\docker\
  7. Создайте контейнер из нового образа myubuntu --> docker run -d -it --name myubuntucontainer myubuntu "/sbin/init"
  8. Подключиться к только что созданному контейнеру --> docker exec -it myubuntucontainer bash
  9. Проверить, находится ли файл text.txt в корне --> ls

Вы должны увидеть файл .

person Sriram Prakash    schedule 10.06.2020

Если вы хотите скопировать содержимое текущего каталога, вы можете запустить:

docker build  -t <imagename:tag> -f- ./ < Dockerfile
person Mohsen Abasi    schedule 25.06.2020