Команда COPY
не копирует из хоста в контейнер, она копирует из контекста сборки в новый слой изображения. Как видите, разница между ними очень большая.
Команда build, как и другие команды docker, основана на клиент / сервер. Сборка может выполняться на удаленном сервере без доступа к компьютеру, на котором выполняется команда docker. Чтобы поддержать копирование файлов в изображение, вы передаете контекст сборки в качестве последнего аргумента команде сборки. Этот контекст часто .
указывает на текущий каталог. Это может быть любой каталог. Вы можете дополнительно изменить то, что включено в этот контекст, с помощью файла .dockerignore
. Самый первый шаг сборки на стороне клиента заключается в том, чтобы сконфигурировать контекст и отправить его на сервер, который распакован во временное местоположение. Чтобы избежать бесконечных циклов (отправка временного каталога на сервер, распакованный в подкаталог этого временного каталога, повторение до тех пор, пока не закончится место на диске) и медленных сборок в целом, вы должны минимизировать этот контекст, отправляя только необходимый каталог создать приложение.
Разница между изображением и контейнером здесь немного менее важна. Контейнер - это экземпляр, который часто выполняется с изолированным процессом внутри, на основе определения из изображения При копировании файлов в изображение не требуется создавать временный контейнер, как обычно при использовании команды RUN
. Конечным результатом всех этих команд в Dockerfile является новый образ, который вы затем можете запускать как один или несколько контейнеров или выдвигать / извлекать из реестров.
Решение состоит в том, чтобы сделать первый каталог в вашей команде копирования частью контекста сборки, обычно это тот же каталог, что и ваш файл Docker, и скопировать из этого относительного пути.