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

在 docker 多阶段构建中使用 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 已经有了将哪个文件复制到哪个目录的信息,所以我问自己是否没有办法使用这种机制。

感谢您的任何想法!

答案1

我现在发现的一种方法是使用检查安装它替代了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 && \
    [...]

这种方法有什么缺点吗?

答案2

./configure --prefix=/path/to/somewhere将强制make install部署以下所有文件/path/to/somewhere

因此在第二阶段很容易从这里复制所有文件。

相关内容