Docker

使用 makefile 在 docker 多階段建構中復製文件

  • August 6, 2019

我正在使用多階段建構將建構環境與最終的 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 已經有了將哪個文件複製到哪個目錄的資訊,所以我問自己是否沒有任何方法可以使用這種機制。

感謝您的任何想法!

我現在發現的一種方法是使用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

所以在第二階段很容易從這個地方複製所有文件。

引用自:https://serverfault.com/questions/960648