Docker - файл COPY из другого рабочего каталога в другой не работает - PullRequest
0 голосов
/ 08 мая 2019

Я использую:

Docker 18.09.1
Ubuntu 16.04

Я хочу скопировать файл из определенной папки из моего образа докера в другую папку в моем образе докера, используя Dockerfile.

Мои docker команды:

sudo docker build -t mytest .
sudo docker run mytest

Мой Dockerfile:

FROM ubuntu:16.04

RUN mkdir -p out/
COPY . out/            <---- this works
COPY /usr/bin/yes /opt <---- this doesn't work!!

CMD out/helloworld

У меня есть C++ приложение под названием helloworld в моей out/ рабочей папке. Однако я хочу скопировать файл с именем "yes", который находится в папке /user/bin/, в мою папку /opt.

Я пробовал команду COPY, а также команду CMD, но безуспешно.

Я попытался проверить, был ли файл там, запустив команду на моей Ubuntu VM:

docker run mytest ls -l /opt
total 0

Моя попытка копирования:

COPY /usr/bin/yes /opt

Моя попытка CMD:

CMD ["cp /usr/bin/yes /opt"]

Ошибка:

COPY failed: stat /var/lib/docker/tmp/docker-builder737799611/usr/bin/yes: no such file or directory

Оба не работают. Как я могу скопировать файл в другую папку (внутри того же образа докера)?

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Здесь указано, что вы не можете использовать абсолютный путь для копирования файла с вашего хоста в ваш контейнер.Это не поддерживается: https://github.com/moby/moby/issues/4592. Поэтому вам нужно сначала подготовить все файлы в текущем каталоге.

0 голосов
/ 08 мая 2019

Команда COPY копирует файлы из контекста сборки (это . в конце команды docker build в вашем примере, то есть текущего каталога) в образ.Вы не можете копировать файлы из контекста компоновки в образ.

Для ваших целей, кажется, вы хотите копировать между двумя разными местами внутри вашего изображения, а не из контекста компоновки вообще.Для этого, если у вас есть команда cp, присутствующая почти в каждом базовом образе, вы можете выполнить:

RUN cp /usr/bin/yes /opt/

Или в синтаксисе json / exec:

RUN [ "cp", "/usr/bin/yes", "/opt/" ]

Обратите внимание, что синтаксис exec требует, чтобы вы отделяли команду для каждого аргумента в отдельную запись массива json.Синтаксис exec также не будет запускать оболочку, поэтому вы не можете делать такие вещи, как расширение переменных и перенаправление ввода / вывода, что в данном случае не выполняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...