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 sed -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 -e 's|repo.ius.io|mirrors.ustc.edu.cn|g' /etc/yum.repos.d/ius.repo \
&& sed -e 's|mirrors.fedoraproject.org|mirrors.ustc.edu.cn|g' /etc/yum.repos.d/epel.repo \
&& sed -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 -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 \
&& rm /anaconda-post.log \
&& 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
# 编译高版本的gdb8.2支持某些高版本的IDE
RUN yum install -y texinfo ncurses-devel expat expat-devel mpfr mpfr-devel \
libiptcdata libiptcdata-devel \
&& curl -o gdb-8.2.tar.xz https://mirrors.ustc.edu.cn/gnu/gdb/gdb-8.2.tar.xz \
&& tar -xf gdb-8.2.tar.xz && cd gdb-8.2 \
&& ./configure && make && make install \
&& cd .. && rm -rf gdb* \
&& ln -s /usr/local/bin/gdb /usr/bin/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"]
标签:bin,RUN,配置,c++,Centos7,usr,&&,local,ssh
From: https://www.cnblogs.com/yangwen0228/p/17132921.html