Используйте makefile для копирования файлов в многоэтапных сборках Docker

Я использую многоэтапные сборки, чтобы отделить среду сборки от окончательного образа докера:

FROM ubuntu:bionic AS build
RUN apt-get update && apt-get install -y \
    build-essential \
    [...]
RUN wget https://someserver.com/somefile.tar.gz && \
    tar xvzf somefile.tar.gz && \
    ./configure && \
    make && make install && \
    [missing part]

FROM ubuntu:bionic
COPY --from=build /tmp/fakeroot/ /
[...]

Есть ли простой способ собрать все файлы, которые были созданы / скопированы во время make install?

В настоящее время я использую комбинацию ldd и отдельную копию файла, чтобы получить их все:

cp /etc/xyz/* /tmp/fakeroot/xyz
cp --parents $(ldd /usr/sbin/nginx | grep -o '/.\+\.so[^ ]*' | sort | uniq) /tmp/fakeroot

Но поскольку make install уже содержит информацию о том, какой файл копировать в какой каталог, я спрашиваю себя, нет ли способа использовать этот механизм.

Спасибо за любые идеи!

2 ответа

Решение

Один из способов, который я нашел сейчас, - это использование checkinstall, который заменяет make install шаг и отслеживает установку для создания пакета на первом этапе. Затем на втором этапе я использую dpkg установить этот пакет.

Итак, теперь я делаю:

FROM ubuntu:bionic AS build
RUN [...]
    ./configure && \
    make && \
    checkinstall --install=no --default && \
    cp XYZ-*.deb /XYZ.deb

FROM ubuntu:bionic
COPY --from=build /XYZ.deb /
RUN dpkg -i /XYZ.deb && \
    rm /XYZ.deb && \
    [...]

Есть ли недостатки этого подхода?

./configure --prefix=/path/to/somewhere заставит make install развернуть все файлы под /path/to/somewhere

Таким образом, легко скопировать все файлы из этого места на втором этапе.

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