C++ 在docker中开发调试技术要点

  • 情景:

       如果你从0到1开始开发一个c++项目,那你是幸运的!因为你可以自己选择你自己适应的开发环境,并且你可以自己选择你想要封装的第三方库,使用自己习惯的开发方法去开发!总而言之,随心所欲!
But,如果你刚接手一个别人开发的项目,并且是一个较早开发的代码!那你可就得小心了!甚至你可能是不幸的。。。
比如我,刚入职一个月,被通知要接手一个已经一年没有维护的代码!当时是信心十足,拿到代码以后,我尝试跑通源码!遗憾的是编译各种报错!大部分来自第三方依赖库的错误!这几乎是不可能通过修改源码的方式让程序跑通,只能另寻出路!由于代码遗留时间较长,文档也零散不多,只能询问前辈获取一些信息!
最后得知,由于这个代码开发得较早,所有的第三方依赖库都是用较低版本的编译器编译!导致我用较新版本的编译器编译时,出现了致命错误!并且这个项目的特殊性,需要用到cuda库,并且适配了指定的显卡!因为我们公司有开发机,并且有的物理机安装指定显卡, 之前有前辈在开发机中用docker配置好了镜像环境,以至于我们不得不采用远程开发机里面用docker的方法来维护这个项目!

  • 解决方案

  1. 方案1:自己带电脑,通过虚拟机linux,安装指定版本的gcc版本!

           结论:不可行,本人电脑的显卡不是指定的显卡,无法跑通代码

  1. 方案2: 在前辈创建的docker镜像的基础上,配置远程调试开发环境,然后在本地ide中开发调试

           结论:可行,而且好使😁
 

  • 具体实施(可以参考下方yml文件)

  1. 安装ssh-server,生成sshd所需的keys,开启sshd
  2. 添加开发账号,设置远程登录权限,以及sudo权限
  3. 映射物理机与docker容器的端口
  4. 开启docker并在本地连接


 

  • 出现的问题与解决方法

  1. 容器启动后提示connection refused!

      解决方法:首先确保开发机上的防火墙没有拦截到你映射的端口,然后你可以进入容器中,
      查看一下22端口是否打开,服务是否正常运行!
      没有服务就安装一下ssh的服务,服务不正常就查看一下log,排查一下

     

      2. 容器内安装完ssh-server后启动sshd时,报“Could not load host key”错误

      在安装完sshd后,执行sshd-keygen,如果没有这个命令,请点击问题链接,查看解决方法

      3. 用户无法登陆

      进入容器(docker attach)查看用户是否存在(cat /etc/passwd), 确认用户是否有登录权限

      4. ide连接成功后提示没有gdb

      进入容器安装gdb

     

      ps:如果你的docker容器是没有yum,apt这类快速安装工具!做好心理准备,因为你的容器配置过程将十分艰苦,你只能通过批处理(批量安装)和docker file的方式配置你的容器环境😁


 

  • Docker-compose 参考

     Centos 7

    version: '3.4'
    
    services:
      centos7-env:
        image: centos:7
        container_name: centos7
        ports:
          - "1996:22"
          - "19966:19966"
        networks:
          - centos7_network
    #    volumes:
    #      - /data/xiaohun/Project/:/app
        stdin_open: true
        tty: true
        privileged: true
        restart: always
        security_opt:
          - seccomp:unconfined
        command:
          - /bin/bash
          - -c
          - |
            yum install sudo -y
            yum install gdb -y
            yum install openssh-server -y
            /usr/sbin/sshd-keygen
            /usr/sbin/sshd
            adduser deploy
            echo "deploy" | passwd deploy --stdin  &>/dev/null
            touch /etc/sudoers
            chmod 644 /etc/sudoers
            echo "deploy ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
            rm -rf /root/.gradle
            /bin/bash
    #      bash -c "/etc/init.d/ssh restart && tail -f /dev/null"
    
    networks:
      centos7_network:
        external: true
    

    Ubuntu 16.04

    version: '3.4'
    
    services:
      ubuntu-16.04-env:
        image: ubuntu:xenial-20210611 
        container_name: ubuntu-16.04-env
        ports:
          - "2021:22"
          - "20211:20211"
        networks:
          - ubuntu-16.04-env_network
    #    volumes:
    #      - /data/zhanyong.wang/Project/ubuntu:/app
        stdin_open: true
        tty: true
        restart: always
        privileged: true
        security_opt:
          - seccomp:unconfined
        command:
          - /bin/bash
          - -c
          - |
            apt update
            apt install sudo -y
            apt install openssh-server -y
            apt install openjdk-8-jdk-headless -y
            apt install rsync gcc g++ gdb cmake -y
            #apt install net-tools -y
            useradd deploy -m
            echo "deploy:deploy" |chpasswd
            touch /etc/sudoers
            chmod 644 /etc/sudoers
            echo "deploy ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
            /etc/init.d/ssh restart
            /bin/bash
    
    networks:
      ubuntu-16.04-env_network: 
        external: true
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值