如何使cmake仅为docker构建可执行文件?
如果我构建一个cmake文件,创建一个带有make的executeble,并删除除可执行文件之外的所有内容,那么可执行文件仍然可以正常工作。我能如何使cmake仅为docker构建可执行文件?,docker,cmake,Docker,Cmake,如果我构建一个cmake文件,创建一个带有make的executeble,并删除除可执行文件之外的所有内容,那么可执行文件仍然可以正常工作。我能 生成文件,但唯一的输出是可以使用./project执行的文件 或 构建所有文件,使用make创建可执行文件,然后删除除可执行文件之外的所有内容 如果是这样,我该怎么办?你为什么需要它 您可以将install()命令添加到CMakeLists.txt中,然后调用makeinstall将可执行文件复制到CMAKE\u install\u PREFIX目录中
install()
命令添加到CMakeLists.txt
中,然后调用makeinstall
将可执行文件复制到CMAKE\u install\u PREFIX
目录中。如果将CMAKE\u INSTALL\u PREFIX
设置为空目录,则会以仅包含可执行文件的目录结尾。为什么需要该目录
您可以将
install()
命令添加到CMakeLists.txt
中,然后调用makeinstall
将可执行文件复制到CMAKE\u install\u PREFIX
目录中。如果您将CMAKE\u INSTALL\u PREFIX
设置为空目录,则将以仅包含可执行文件的目录结束。如果我正确获取此信息,如果您想创建一个即使docker映像没有任何依赖项也无法执行的独立二进制文件,那么您需要在构建过程中使用static选项-我不是这方面的专家-可能如的以下回答中所述
接下来,您可能会使用一个in-docker,它将使您能够在没有任何构建依赖项的情况下,只使用可执行文件的最终最小映像,而只使用运行时环境所需的包。我有一个例子不是用make
,它是用g++
创建的,但实现了如下类似的概念:
FROM gcc:5 as builder
COPY ./hello_world_example.cc /hello_world_example.cc
RUN g++ -o hello_world_binary -static hello_world_example.cc && chmod +x hello_world_binary
FROM debian:jessie
COPY --from=builder /hello_world_binary /hello_world_binary
CMD ["/hello_world_binary"]
以及运行容器时的最终结果:
$ docker run --rm -it helloworldimage:latest
Hello from Dockerized image
如果我理解正确,您希望创建一个独立的二进制文件,即使docker映像没有任何依赖项也无法执行,那么您需要在构建过程中使用静态选项-我不是这方面的专家-可能如以下的答案中所述 接下来,您可能会使用一个in-docker,它将使您能够在没有任何构建依赖项的情况下,只使用可执行文件的最终最小映像,而只使用运行时环境所需的包。我有一个例子不是用
make
,它是用g++
创建的,但实现了如下类似的概念:
FROM gcc:5 as builder
COPY ./hello_world_example.cc /hello_world_example.cc
RUN g++ -o hello_world_binary -static hello_world_example.cc && chmod +x hello_world_binary
FROM debian:jessie
COPY --from=builder /hello_world_binary /hello_world_binary
CMD ["/hello_world_binary"]
以及运行容器时的最终结果:
$ docker run --rm -it helloworldimage:latest
Hello from Dockerized image
若应用程序比hello world更复杂,那个么由于缺少系统二进制文件,使用scratch映像可能是一个问题。最好使用一些系统映像,如ubuntu或debian@Miq谢谢我已经更新了答案,关于cmake部分还有其他建议吗?没有,我也会使用多级构建。至于cmake,我不是专家,但我记得用它构建软件包并不难。如果应用程序比hello world更复杂,使用scratch映像可能会因为缺少系统二进制文件而成为一个问题。最好使用一些系统映像,如ubuntu或debian@Miq谢谢我已经更新了答案,关于cmake部分还有其他建议吗?没有,我也会使用多级构建。至于cmake,我不是专家,但我记得用它构建软件包并不难。