Я использую многоступенчатые сборки, чтобы отделить среду сборки от окончательного образа докера:
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
Так что на втором этапе легко скопировать все файлы из этого места.