Як скопіювати файл з хосту в контейнер за допомогою Dockerfile


80

Я написав файл Docker, який виглядає так

FROM ubuntu:12.04

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

Зараз abc.txtу мене на хост-машині викликається файл . Як я можу скопіювати його в цей контейнер. Чи є якийсь крок, який я можу додати в Dockerfile, який копіює з хосту в контейнер.


до речі, wget вже включений в Ubuntu 12.04, якщо пам'ять мене
радує

2
Ваше оновлення та інсталяцію слід розмістити в одному рядку, див. Docs.docker.com/articles/dockerfile_best-practices/#run
Генрік Карлссон,

вам потрібен файл у зображенні докера чи просто у контейнері докера ?
Томаслевей

Відповіді:


111

Використовуйте команду 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 читайте в офіційній документації


10
Чи є можливість зробити це, використовуючи абсолютний шлях хост-машини?
thenakulchawla

10
На жаль, ні, ви можете додавати файли лише з папки вашого файлу Docker або його підпапок. Також м’які посилання також не працюватимуть. Це пов’язано з процесом побудови докера. Побудова починається зі стиснення каталогу, в якому знаходиться файл Dockerfile, до архіву та використання цього архіву для отримання файлів, що використовуються в командах ADD / COPY.
george.yord

дякую, я написав сценарій оболонки для автоматизації цієї частини. Було б краще, якби я впорався з цим через Dockerfile.
thenakulchawla

37

Для тих, хто отримує цю (страшенно незрозумілу) помилку:

Помилка копіювання: stat /var/lib/docker/tmp/docker-builderXXXXXXX/abc.txt: такого файлу або каталогу немає

Причин може бути безліч, у тому числі:

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

Іноді WORKDIR /abcслідують COPY . xyz/роботи, де COPY /abc xyz/не вдається, але це трохи потворно.


Додавання до цього - якщо ви перемістите файл Docker у pycharm, це може автоматично змінити контекст.
Марсель Вілсон,

Ага, дякую! Знайшов набридливий, .gitignoreщо ADD foo.zip .заважав у моєму Dockerfile.
hashlock

Дякую! Для мене випуск був.gitignore
jrp

5

Я зіткнувся з цією проблемою, я не зміг скопіювати каталог zeppelin [1GB] у контейнер docker і отримував проблему

Помилка копіювання: stat /var/lib/docker/tmp/docker-builder977188321/zeppelin-0.7.2-bin-all: такого файлу або каталогу немає

Я використовую версію docker: 17.09.0-ce і вирішив проблему, виконавши такі дії.

Крок 1: скопіюйте каталог zeppelin [який я хочу скопіювати в пакет docker] в каталог, що містить "Dockfile"

Крок 2: відредагуйте файл Dock і додайте команду [місце, куди ми хочемо скопіювати] ДОДАТИ. / 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


3
Важливим кроком тут є той факт, що файл повинен знаходитися в тій же папці, що і файл Docker
бормат


1

Я отримав таку помилку при використанні Docker 19.03.8 на CentOS 7:

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

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


0

Мені вдалося скопіювати файл із мого хосту до контейнера в докер-файлі як такий:

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

    COPY test.txt /

  5. Витягніть копію ubuntu з концентратора docker -> 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

Ви повинні побачити файл.


0

Якщо ви хочете скопіювати вміст поточного каталогу, ви можете запустити:

docker build  -t <imagename:tag> -f- ./ < Dockerfile
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.