Dockerfile&HelloWordInCPP
1.C/C++GCC(GNU Compiler Collection)是一套由GNU开发的编程语言编译器,是一套以GPL及LGPL许可证所发行的自由软件,也是GNU计划的关键部分。GCC(特别是其中的C语言编译器)通常被认为是跨平台编译器的事实标准。GCC可处理C/C++,以及Fortran、Pascal、Objective-C、Java、Ada等多种语言。将C/C++代码运行在容器内的最简方法,
·
0.引用
使用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文件,否则会报错.
更多推荐
已为社区贡献3条内容
所有评论(0)