Есть два возможных ответа на этот вопрос.
Если у вас есть файл .dockerignore
, который включает *.o
, или у вас настроено отдельное дерево сборки, то, когда вы достигнете строки RUN make
,образ будет содержать все исходные файлы и ни один из объектных файлов, и сборка будет выполняться с нуля.Это самый «чистый» ответ - вы должны получить очень последовательный результат сборки - но на самом деле это может занять некоторое время.
Если у вас его нет, то все, что вы собрали локально, будет скопировано визображение, включая его временные метки, и вы получите инкрементную сборку.Но это означает, что разные люди, которые создают одно и то же приложение из одного и того же частичного дерева исходных текстов, получат разные результаты;В проекте, основанном на Autoconf, все возможности приложения можно определить, установил ли конкретный разработчик какую-либо библиотеку на своем хосте.
Если у вас уже есть система сборки, основанная в основном на Make, я мог бы придерживаться этогои предпочитают модель «делать все в Make» модели «делать все в Docker».В GNU Make вы можете написать фрагмент, подобный следующему:
DOCKER_TAG := $(shell date +%Y%m%d)
.PHONY: docker
docker:
$(MAKE) install DESTDIR=docker/dist
cp Dockerfile docker
docker build -t me/myapp:$(DOCKER_TAG) docker
Это также дает вам практический эффект многоэтапной сборки (вы предварительно скомпилировали приложение, поэтому вам не нужен набор инструментов вDocker ведет трубопровод куда угодно. Так же, как вы сейчас sudo make install
, вы sudo make docker
создадите образ Docker.