Импорт 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
и другие команды.