使用 makefile 在 docker 多阶段构建中复制文件

sc9*_*911 4 make docker

我使用多阶段构建将构建环境与最终的 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/ /
[...]
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法来收集make install在运行时创建/复制的所有文件?

目前我正在使用ldd和单个文件副本的组合来获取它们:

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

但是由于 make install 已经有了将哪个文件复制到哪个目录的信息,我问自己是否没有任何方法可以使用这种机制。

感谢您的任何想法!

sc9*_*911 5

我现在发现的一种方法是使用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 && \
    [...]
Run Code Online (Sandbox Code Playgroud)

这种方法有什么缺点吗?