迈向基于 docker 的 C/C++ 应用程序构建
***注意:***基于此文章,我已在 GitHub 上发布 buildock。
许多 C/C++ 程序员和项目经理都知道为所有开发者创建可重现构建环境的痛苦:Works for me 是一个常见的梗,并非没有原因。
我的方法是不一定将应用程序本身 docker 化,而是将构建系统 docker 化,将特定编译器版本及其周围的系统以及所有必需的系统级库封装在 Docker 镜像中。
以 C++ 中必做的 Hello World 为例:
main.cpp
// main.cpp
#include <iostream>
using namespace std;
int main() {
cout << "Hello, World!" << endl;
return 0;
}以及对应的 Makefile:
Makefile
all:
g++ -o helloworld main.cpp
我们如何在不安装编译器和GNU make的情况下在本地计算机上编译这个简单项目(不允许使用构建服务器作弊)?
实际上这相当简单:
docker-run.sh
docker run --user $(id -u):$(id -g) -v $PWD:/app -it ulikoehler/ubuntu-gcc-make make分解说明:
docker run:创建新的 docker 容器并在其中运行命令--user $(id -u):$(id -g):这使 docker 容器以当前用户的 ID 和当前用户的组运行 - 既为了防止编译器以root创建输出文件,也为了防范一些 IT 安全风险。另请参见如何以当前用户和组运行 docker 容器-v $PWD:/app:将当前目录($PWD)挂载到容器中的/app。由于用于构建容器的 Dockerfile 包含WORKDIR /app指令,我们在容器中运行的任何命令默认都将在/app目录中执行 - 因此在主机上的当前本地目录中执行。-it以交互模式运行容器,即按键将传递给你正在运行的命令。此外,这意味着我们的命令只有在容器完成执行后才会结束。ulikoehler/ubuntu-gcc-make:这是我们用于该示例的镜像。它只是一个安装了build-essentials和make并将WORKDIR设置为/app的ubuntu:18.04基础镜像make:这是我们要在容器中运行的命令。你可以在这里使用任何命令,甚至不使用命令也是可能的(在这种情况下,将使用容器的默认命令 - 对于ulikoehler/ubuntu-gcc-make,那是CMD [ "/usr/bin/make" ])
这是用于生成 ulikoehler/ubuntu-gcc-make 的完整 Dockerfile:
Dockerfile
FROM ubuntu:18.04
RUN apt update && apt -y install build-essential make && rm -rf /var/lib/apt/lists/*
WORKDIR /app
CMD [ "/usr/bin/make" ]Check out similar posts by category:
Build Systems, C/C++, Container, Docker
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow