Centos7中配置c++开发环境

Centos7中配置c++开发环境

c++不像Java等语言是跨平台的,在Windows开发之后,在Linux直接部署就行了,而是需要在Linux中进行开发和调试,那怎么在Windows系统里面模拟一个Linux的环境呢,最方便的就是利用Docker了,可以提供一个干净稳定可以快速复制的开发环境,省得因为各种环境和依赖库版本不同而引起的各种问题了,真是Docker使用的一个非常好的场景啊,并且,部署验证阶段,分布式的集群,也可以使用Docker来模拟部署,Docker真是程序员的好帮手啊。

FROM centos:7

# 非常重要,第一时间设置时区
ENV TZ Asia/Shanghai
RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone

# 使用中科大的镜像加速,并且添加官方外的第三方软件源,如ius和epel,里面可以直接安装高版本的git236和cmake3,可以节省大量的源码编译时间
RUN curl -k -o epel-release-latest-7.noarch.rpm https://mirrors.ustc.edu.cn/epel/epel-release-latest-7.noarch.rpm \
&& curl -k -o ius-release-el7.rpm https://mirrors.ustc.edu.cn/ius/ius-release-el7.rpm \
&& rpm -i epel-release-latest-7.noarch.rpm ius-release-el7.rpm \
&& rm *.rpm /anaconda-post.log

RUN sed -i -e 's|^mirrorlist=|#mirrorlist=|g' \
        -e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.ustc.edu.cn/centos|g' \
        /etc/yum.repos.d/CentOS-Base.repo \
        && yum makecache \
        && yum install -y https://mirrors.ustc.edu.cn/ius/ius-release-el7.rpm \
    && sed -i -e 's|repo.ius.io|mirrors.ustc.edu.cn|g' /etc/yum.repos.d/ius.repo \
    && sed -i -e 's|mirrors.fedoraproject.org|mirrors.ustc.edu.cn|g' /etc/yum.repos.d/epel.repo \
    && sed -i -e 's|^mirrorlist=|#mirrorlist=|g' \
        -e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.ustc.edu.cn/centos|g' \
        /etc/yum.repos.d/CentOS-Base.repo \
    && yum makecache

# 添加 sshd 的功能,与IDE的集成基本上都是基于 ssh 和 sftp,所以,这个是基本的功能了,设置默认的密码root,后面也有免密登录的配置
RUN yum install -y openssh-server \
&& sed -i -e 's|^#PermitRootLogin yes|PermitRootLogin yes|' /etc/ssh/sshd_config \
&& ssh-keygen -A && echo "root:root" | chpasswd

# 添加 c++ 编译和开发相关的基础组件包
RUN yum install -y cmake3 make automake autoconf gcc gcc-c++ \
which file wget \
&& ln -s /usr/bin/cmake3 /usr/bin/cmake \
&& ln -s /usr/bin/ctest3 /usr/bin/ctest \
&& ln -s /usr/bin/cpack3 /usr/bin/cpack \
&& ln -s /usr/bin/cctest3 /usr/bin/cctest

RUN yum install -y \
        doxygen valgrind cppcheck \
        git236 net-tools zlib-devel python python-devel

# xauth for terminal
RUN yum install -y xauth \
&& touch /root/.Xauthority

# vim
RUN yum install -y vim \
&& echo -e '" tab\n\
set expandtab\n\
set smarttab\n\
set tabstop=4\n\
set softtabstop=4\n\
set shiftwidth=4\n\
\n\
" encoding\n\
set encoding=utf-8\n\
set fileencodings=utf-8,gb18030,gbk,gb2312\n\
set termencoding=encoding\n\
\n\
set showmatch\n\
set autoindent\n\
set hlsearch\n\
set cursorline\n\
\n\
set noerrorbells\n\
set number\n\
\n\
set nobackup\n\
set noswapfile\n\
set autowrite\n\
set nocompatible\n\
\n\
map <C-S-c> :w !/mnt/c/Windows/System32/clip.exe\n\
map! <C-S-c> :w !/mnt/c/Windows/System32/clip.exe\n\
\n\
" status line\n\
set laststatus=2\n\
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ [LEN=%L]\n\
\n\
colorscheme desert\n\
' >> /etc/vimrc

# encoding 安装gcc之后,locale就被损坏了
RUN localedef -v -c -i en_US -f UTF-8 en_US.utf-8 \
|| localedef -v -c -i zh_CN -f UTF-8 zh_CN.utf-8 \
|| echo 'export LANG="en_US.utf-8"' >> /etc/profile.d/init.sh \
&& echo "alias l='ls -la --color=auto'" >> /etc/profile.d/init.sh

# 编译高版本的gdb12.1支持某些高版本的IDE,9之后可以支持byte[]显示为字符串,可以原生支持更多python的扩展
RUN yum install -y texinfo ncurses-devel expat expat-devel mpfr mpfr-devel \
libiptcdata libiptcdata-devel \
&& curl -o gdb-12.1.tar.xz http://mirrors.ustc.edu.cn/gnu/gdb/gdb-12.1.tar.xz \
&& tar -xf gdb-12.1.tar.xz && cd gdb-12.1 \
&& ./configure --prefix=/usr && make -j8 && make install \
&& cd .. && rm -rf gdb*

# 添加特殊的老版本兼容项目,这个其实可以通过GitHub下载,不用使用本地文件,但是GitHub下载比较慢,还是使用本地源码吧,其实编译一次之后,也可以把所有的include、lib进行打包,后面制作时只需要复制添加就可以了,可以节省大量的时间,这个编译是非常慢的。
ADD gtest-1.7.0.tar.gz /usr/local/src
RUN cd /usr/local/src/gtest-1.7.0 \
&& cmake . && make \
&& ln -rs /usr/local/src/gtest-1.7.0/include/gtest /usr/local/include \
&& ln -s /usr/local/src/gtest-1.7.0/*.a /usr/local/lib

ADD boost_1_66_0.tar.gz /usr/local/src
RUN cd /usr/local/src/boost_1_66_0 \
&& /bin/bash ./bootstrap.sh && ./b2 install

ADD protobuf-3.1.0.tar.gz /usr/local/src
#RUN cd /usr/local/src/protobuf-3.1.0/cmake \
#&& cmake . -Dprotobuf_BUILD_SHARED_LIBS=ON -Dprotobuf_BUILD_TESTS=OFF && make && make install
RUN cd /usr/local/src/protobuf-3.1.0 \
&& ./configure CFLAGS="-fPIC" CXXFLAGS="-fPIC" && make && make install

ADD rapidjson-1.1.0.tar.gz /usr/local/src
RUN cd /usr/local/src/rapidjson-1.1.0 \
&& cmake . && make && make install

# 添加vscode的服务端程序和插件,第一次制作时,应该是没有这个server的,如果容器的运行环境可以上网,那很方便,直接运行之后,vscode会自动从网上把server下载下来并安装好,里面的插件也可以从本地的vscode往服务器安装,但是里面的c/c++的组件windows版本和linux版本是不一样的,如果容器可以上网,那会自动下载linux的版本,如果不能上网,vscode仅仅把本地的windows版本上传到服务器,会运行不起来,就需要自己独立到插件市场下载对应的linux版本,然后,把下载的插件上传到容器里面,再通过vscode的界面选择容器里面的插件文件进行安装。其中,容器不能上网的情况下,server的下载是和vscode的客户端对应的,vscode客户端有一个版本号(help->About->commit),复制这个版本号,然后,从官网下载对应的server,再上传到容器中,官网地址,可以把其中的commit id改为自己的实际版本号:http://update.code.visualstudio.com/commit:e2816fe719a4026ffa1ee0189dc89bdfdbafb164/server-linux-x64/stable 或者使用国内镜像 https://vscode.cdn.azure.cn/stable/e2816fe719a4026ffa1ee0189dc89bdfdbafb164/vscode-server-linux-x64.tar.gz,插件可以从https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools进行下载。
ADD vscode-server.tar.gz /root

# ssh免密登录:将本地是id_rsa.pub内容拷贝到/root/.ssh/authorized_keys,这里的id_rsa.pub content替换为实际的内容,这里仅自己使用,先简单写死,其他人要用其实也可以通过输入密码root接入。当然,如果是制作公共的镜像,还有另外四种方法:1.制作一个启动start.sh,然后,通过bash脚本中通过自定义的环境变量ID_RSA_PUB把这个public key配置到authorized_keys文件中,本地的实际id_rsa.pub内容通过-e环境变量的方式提供,可以通过 `sudo docker run -d -e ID_RSA_PUB $(cat ~/.ssh/id_rsa.pub) --name test image:tag`的方式启动;2. 或者通过编写一个本地启动sh,在docker run之后,追加一个public key的写入: `sudo docker exec -it test /bin/bash -c "echo $(cat ~/.ssh/id_rsa.pub) > /root/.ssh/authorized_keys"`;3. 通过volume文件映射的方式进行挂载也可以`sudo docker run -d -v ~/.ssh/id_rsa.pub:/root/.ssh/authorized_keys:rw`; 4. 或者通过`sudo docker cp ~/.ssh/id_rsa.pub test:/root/.ssh/authorized_keys`。其中,文件挂载的方式感觉是最简单方便的,并且,外部的id_rsa.pub修改了,也会自动同步,当然,一般这个也不会随便变动。
RUN mkdir /root/.ssh && echo 'id_rsa.pub content' > /root/.ssh/authorized_keys

EXPOSE 22
#
#ENTRYPOINT ["/bin/bash"]
CMD ["/usr/sbin/sshd", "-D"]
posted @ 2023-02-18 16:18  yangwen0228  阅读(633)  评论(0编辑  收藏  举报