我正在使用多阶段构建将构建环境与最终的 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
因此在第二阶段很容易从这里复制所有文件。