Управление файлами в образе

Введение в Docker

Tim Sangster

Software Engineer @ DataCamp

Копирование файлов в образ с помощью COPY

Инструкция COPY копирует файлы с локальной машины в создаваемый образ:

COPY <src-path-on-host> <dest-path-on-image>
COPY /projects/pipeline_v3/pipeline.py /app/pipeline.py
docker build -t pipeline:v3 .
...
[4/4] COPY ./projects/pipeline_v3/pipeline.py /app/pipeline.py

Если путь назначения не содержит имени файла, используется исходное имя:

COPY /projects/pipeline_v3/pipeline.py /app/
Введение в Docker

Копирование папок с помощью COPY

Если имя файла в src-path не указано, копируется всё содержимое папки.

COPY <src-folder> <dest-folder>
COPY /projects/pipeline_v3/ /app/

COPY /projects/pipeline_v3/ /app/ скопирует всё из pipeline_v3/:

/projects/
    pipeline_v3/
        pipeline.py
        requirements.txt
        tests/
            test_pipeline.py
Введение в Docker

Копирование файлов из родительского каталога

/init.py
/projects/
    Dockerfile
    pipeline_v3/
        pipeline.py

Если текущий рабочий каталог находится в папке projects/.

Скопировать init.py в образ не получится.

docker build -t pipeline:v3 .
 => ERROR [4/4] COPY ../init.py /     0.0s
failed to compute cache key: "../init.py" not found: not found
Введение в Docker

Загрузка файлов

Вместо копирования локальных файлов их часто загружают прямо при сборке образа:

  • Загрузить файл

RUN curl <file-url> -o <destination>

  • Распаковать файл

RUN unzip <dest-folder>/<filename>.zip

  • Удалить исходный zip-файл

RUN rm <copy_directory>/<filename>.zip

Введение в Docker

Эффективная загрузка файлов

  • Каждая инструкция, загружающая файлы, увеличивает общий размер образа.
  • Даже если файлы впоследствии удаляются.
  • Решение — загрузить, распаковать и удалить файлы в одной инструкции.
RUN curl <file_download_url> -o <destination_directory>/<filename>.zip \
&& unzip <destination_directory>/<filename>.zip -d <unzipped-directory> \
&& rm <destination_directory>/<filename>.zip
Введение в Docker

Итоги

Задача Инструкция Dockerfile
Копировать файлы с хоста в образ COPY <src-path-on-host> <dest-path-on-image>
Копировать папку с хоста в образ COPY <src-folder> <dest-folder>
Копировать из родительского каталога нельзя COPY ../<file-in-parent-directory> /

Чтобы образ оставался компактным, выполняйте загрузку, распаковку и очистку в одной инструкции RUN:

RUN curl <file_download_url> -o <destination_directory> \
&& unzip <destination_directory>/<filename>.zip -d <unzipped-directory> \
&& rm <destination_directory>/<filename>.zip
Введение в Docker

Давайте потренируемся!

Введение в Docker

Preparing Video For Download...