-
情景:
如果你从0到1开始开发一个c++项目,那你是幸运的!因为你可以自己选择你自己适应的开发环境,并且你可以自己选择你想要封装的第三方库,使用自己习惯的开发方法去开发!总而言之,随心所欲!
But,如果你刚接手一个别人开发的项目,并且是一个较早开发的代码!那你可就得小心了!甚至你可能是不幸的。。。
比如我,刚入职一个月,被通知要接手一个已经一年没有维护的代码!当时是信心十足,拿到代码以后,我尝试跑通源码!遗憾的是编译各种报错!大部分来自第三方依赖库的错误!这几乎是不可能通过修改源码的方式让程序跑通,只能另寻出路!由于代码遗留时间较长,文档也零散不多,只能询问前辈获取一些信息!
最后得知,由于这个代码开发得较早,所有的第三方依赖库都是用较低版本的编译器编译!导致我用较新版本的编译器编译时,出现了致命错误!并且这个项目的特殊性,需要用到cuda库,并且适配了指定的显卡!因为我们公司有开发机,并且有的物理机安装指定显卡, 之前有前辈在开发机中用docker配置好了镜像环境,以至于我们不得不采用远程开发机里面用docker的方法来维护这个项目!
-
解决方案
- 方案1:自己带电脑,通过虚拟机linux,安装指定版本的gcc版本!
结论:不可行,本人电脑的显卡不是指定的显卡,无法跑通代码
- 方案2: 在前辈创建的docker镜像的基础上,配置远程调试开发环境,然后在本地ide中开发调试
结论:可行,而且好使😁
-
具体实施(可以参考下方yml文件)
- 安装ssh-server,生成sshd所需的keys,开启sshd
- 添加开发账号,设置远程登录权限,以及sudo权限
- 映射物理机与docker容器的端口
- 开启docker并在本地连接
-
出现的问题与解决方法
-
容器启动后提示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