Назад | Перейти на главную страницу

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

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

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 уже имеет информацию о том, какой файл копировать в какой каталог, я спрашиваю себя, нет ли способа использовать этот механизм.

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

Один из способов, который я нашел сейчас, - это использовать проверить установку который заменяет make install step и отслеживает установку для создания пакета на первом этапе. Затем на втором этапе я использую 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

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