Импорт Dockerfile из другого локального каталога через FROM

Я хочу создать многоступенчатый процесс сборки, в то время как каждый из файлов Docker локально вложен в свои собственные каталоги с соответствующими зависимостями, которые ДОБАВЛЯЮТСЯ для каждого файла Docker. Есть ли способ импортировать файл Docker из другого каталога локально, тогда как я могу импортировать его с помощью Docker? FROM команда, чтобы создать несколько этапов в сборке?

Если нет, смогу ли я ADD другой промежуточный файл Docker в текущий файл Docker, а затем использовать FROM внутри контейнера Docker, удаляя его после добавления и использования в FROM?

Может быть, я думаю о многоступенчатых сборках неправильно.

Или я могу просто бежать FROM {path/to/docker/locally}? Это не работает для меня.

4 ответа

Решение

Есть ли способ локально импортировать файл Docker из другого каталога, в то время как я могу импортировать его с помощью команды FROM Docker, чтобы создать несколько этапов сборки?

FROM инструкция используется только для импорта готовых изображений, ее нельзя использовать для импорта файла Dockerfile.

Если нет, смогу ли я добавить другие промежуточные файлы Docker в текущий файл Docker?

ADD Инструкция может копировать только файлы внутри контекста сборки (который обычно является текущим рабочим каталогом) в контейнеры. Ты не можешь ADD ../something /something,

Или я могу просто запустить FROM {путь / к / докер / локально}?

Нет. Но один способ, который сработает для вас, это сначала создать другой образ, скажем, его зовут first-image:latestтогда вы можете использовать COPY инструкция для копирования файлов с этого изображения:

COPY --from=first-image:latest /some/file /some/file

Лучшее решение, которое я нашел для этого до сих пор, - это использовать этапы Dockerfile.

Сложить все это в один Dockerfile:

      FROM php:8.1-fpm AS base

RUN apt-get update && apt-get install -y \
    libzip-dev libonig-dev \
    libwebp-dev # ...

RUN docker-php-ext-install zip mbstring pdo pdo_mysql gd bcmath sockets opcache soap gmp intl

# Worker
FROM base AS worker
RUN apt install -y supervisor 

# CLI
FROM base AS cli
RUN apt-get install -yq git unzip
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

И тогда вы можете использовать его в docker-compose.yml:

      services:
  worker:
    build:
      context: php
      dockerfile: Dockerfile
      target: worker

  cli:
    build:
      context: php
      dockerfile: Dockerfile
      target: cli

Это сделает сборку контейнеров эффективной, и они будут построены только один раз. Вы также можете использовать baseсебя в качестве цели.

Если вы используете Docker 20.10+, вы можете сделать это:

      # syntax = edrevo/dockerfile-plus

INCLUDE+ {path/to/docker/locally}

RUN ...

The INCLUDE+инструкция импортируется первой строкой в ​​Dockerfile. Подробнее о dockerfile-plus можно прочитать на https://github.com/edrevo/dockerfile-plus .

Если я правильно понимаю вопрос, то, что вы пытаетесь достичь, это создать изображение, а затем использовать то же изображение и построить что-то (следующий "этап") поверх него.

Docker поддерживает эту концепцию, но не импортирует другой Dockerfile.

Dockerfiles и каталог, в котором они находятся, должны быть автономными, т.е. единственное, что вам нужно для создания образа - это содержимое каталога. Поэтому вы не можете загружать другие файлы Docker из других каталогов.

Можно было бы построить базовое изображение, например, myappimage, используя Dockerfile myappimage/Dockerfile, После того, как вы его построили, вы можете обратиться к этому базовому образу в другом Dockerfile (например, mytestingimage/Dockerfile) с помощью FROM myappimage построить образ (mytestingimage) на вершине myappimage,

Затем, mytestingimage в точности как myappimage но с дополнительными слоями, добавленными вашим ADD и другие команды.

Другие вопросы по тегам