0.引用

docker-gcc

使用Docker Hub官方gcc:latest镜像编译C/C++程序以及缩小镜像的方法

1.Dockfile的编写

GCC(GNU Compiler Collection)是一套由GNU开发的编程语言编译器,是一套以GPL及LGPL许可证所发行的自由软件,也是GNU计划的关键部分。GCC(特别是其中的C语言编译器)通常被认为是跨平台编译器的事实标准。

GCC可处理C/C++,以及Fortran、Pascal、Objective-C、Java、Ada等多种语言。

将C/C++代码运行在容器内的最简方法,就是将编译指令写入Dockerfile中,然后使用此Dockerfile构建自定义镜像,最后直接运行此镜像,即可启动程序。

FROM gcc:4.9
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
RUN g++ -o myapp main.cpp
CMD ["./myapp"]

编辑main.cpp,内容如下:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <string>
#include <sys/stat.h>
#include <sys/types.h>
using namespace std;
string GetSysTime(int iFormat)
{
	time_t ttNow = time(NULL);
	struct tm stm;
	struct tm *ptmNow = localtime_r(&ttNow, &stm);
	char cTemp[30];
	string strDateTime = "";
	memset(cTemp, 0, sizeof(cTemp));
	switch (iFormat)
	{
		case 1:
			strftime(cTemp, 30, "%Y%m%d%H%M%S", ptmNow);
			break;
		case 2:
			strftime(cTemp, 30, "%Y-%m-%d %H:%M:%S", ptmNow);
			break;
		case 3:
			strftime(cTemp, 30, "%Y/%m/%d/%H/%M/%S", ptmNow);
			break;
		case 4:
			strftime(cTemp, 30, "%Y", ptmNow);
			break;
		case 5:
			strftime(cTemp, 30, "%m", ptmNow);
			break;
		case 6:
			strftime(cTemp, 30, "%d", ptmNow);
			break;
		case 7:
			strftime(cTemp, 30, "%H", ptmNow);
			break;
		case 8:
			strftime(cTemp, 30, "%M", ptmNow);
			break;
		case 9:
			strftime(cTemp, 30, "%S", ptmNow);
			break;
		case 10:
			strftime(cTemp, 30, "%u", ptmNow);
			break;
		default:
			break;
	}
	strDateTime = cTemp;
	return strDateTime;
}

int main()
{
        if ( access("/usr/src/log/", F_OK) != 0) 
        {
           int status =  mkdir("/usr/src/log/", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
           if(0==status)
           {
             printf("dir created succeccfully");
           }
           else 
          {
              printf("dir created failed ");
           }
        } 
	FILE *file = fopen("/usr/src/log//1.txt", "a");
	if(file == NULL)
	{
		printf("open error!\n");
		return 0;
	}
	while(1)
	{
		char name[] = " v1 hello world!  ";
		string strNowTime = GetSysTime(4) + "-" + GetSysTime(5) + "-" + GetSysTime(6) + " " + GetSysTime(7) + ":" + GetSysTime(8) + ":" + GetSysTime(9) + "\n";
		strcat(name,strNowTime.c_str());
		fputs(name, file);
		fflush(file);
		sleep(1);
	}
	fclose(file);
	return 0;
}

2.使用Dockerfile来构建镜像my-gcc-app 

docker build -t gcc-image:1.0 .

3.创建并运行此容器

以下命令会编译并运行程序,输出观察容器内的1.txt文件及宿主机中的1.txt文件的内容.

docker run -v /root/test:/usr/src/log/ -d --privileged=true  --name gcc-container gcc-image:1.0

4.运行时的问题记录

docker run -v /root/test/1.txt:/usr/src/myapp/1.txt -d --privileged=true  --name gcc-container gcc-image:1.0

宿主机上不能有/root/test/1.txt/文件夹,而且要提前有/root/test/1.txt文件,否则会报错.

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐