在开发过程在难免会碰到以下问题,比如安装过多依赖污染系统环境而且重装系统又过于折腾,或者系统无法安装特定依赖。 此时,docker的隔离环境便可解决以上问题,随时可以创建一个任意版本的系统环境。 要把docker和CLion结合起来使用,还需要配置docker的ssh服务,CLion通过ssh 远程调试。 当然,对于一个远程主机只要配置好了ssh,也可以使用CLion来远程调试。
参考文章使用 Clion 调试 Docker 内的 C++ 代码
配置docker
编写docker-compose.yml
coder 文件夹中放 Dockerfile
shell文件夹中放 cmake.sh 和 entrypoint.sh
version: '2'
services:
coder:
build:
context: coder
args:
#http_proxy : "" # no proxy
#https_proxy : "" # no proxy
http_proxy: "http://172.17.0.1:8889" #ok no need to map port
https_proxy: "http://172.17.0.1:8889" #ok no need to map port
#http_proxy: "http://host.docker.internal:8889" # fail
#https_proxy: "http://host.docker.internal:8889"# fail
#http_proxy: "http://localhost:8889"# fail
#https_proxy: "http://localhost:8889"# fail
container_name : coder
security_opt: # options needed for gdb debugging
- seccomp:unconfined
- apparmor:unconfined
user: waxz
working_dir: /home/waxz
#network_mode: host
#network_mode: bridge
ports:
- "2222:22"
cap_add:
- ALL
volumes:
- /tmp/.X11-unix:/tmp/.X11-unix:rw
- $HOME/.Xauthority:/home/waxz/.Xauthority:rw
#- /tmp/.docker.xauth:/tmp/.docker.xauth:rw
- /dev/usb:/dev/usb
- ./shell:/opt/shell
# - ./shell/.bashrc:/home/waxz/.bashrc
- ./share:/home/waxz/share
- ./share/.tmux.conf:/home/waxz/.tmux.conf
- /home/waxz/CLionProjects:/home/waxz/CLionProjects
entrypoint: /opt/shell/entrypoint.sh
stop_signal: SIGKILL
pid: "host"
ipc: host
privileged: true
read_only: false
stdin_open: true
tty: true
#networks:
#- default
编写 Dockerfile
基础镜像根据需要更改
FROM gramaziokohler/ros-panda-planner
RUN apt-get -y update && apt-get install -y openssh-server rsync gdb
RUN useradd -ms /bin/bash waxz && echo 'waxz:1234' | chpasswd && adduser waxz sudo
RUN mkdir /var/run/sshd
#RUN echo 'root:THE_PASSWORD_YOU_CREATED' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile
RUN env | grep _ >> /etc/environment && env | grep PATH >> /etc/environment
编写 cmake.sh
CLion远程调用cmake时,可能由于缺少环境变量导致找不的依赖从而编译失败
#!/bin/bash
source /opt/ros/kinetic/setup.bash
export ROS_MASTER_URI=http://localhost:11311
quoted_args="$(printf "${1+ %q}" "$@")" # Note: this will have a leading space before the first arg
# echo "Quoted args:$quoted_args" # Uncomment this to see what it's doing
#echo "quoted_args ${quoted_args}"
bash -c "cmake $quoted_args"
编写 entrypoint.sh
容器启动时自动运行脚本,启动ssh服务器
#!/bin/bash
source /opt/ros/kinetic/setup.bash
echo 1234 | sudo -S sh -c "sudo /usr/sbin/sshd -D"
运行容器
docker-compose up
或
docker-compose run --service-port coder
或者不启动 sshd,直接进入 bash
docker-compose run --service-port --entrypoint bash coder
ssh 连接测试
ssh waxz@localhost -p 2222 -vvv
CLion
Create a toolchain with remote credentials
- Go to
Settings=>Build, Execution, Deployment=>Toolchains - click
+and selectRemote Hostfrom the drop-down menu to create a new toolchain. -
Set
Credentialsfield. In the dialog that opens, create an SSH configuration and provide the credentials for accessing you remote machine. Existing SSH configurations are available from the drop-down list. - 设置远程主机的cmake工具,可以使用默认路径,如果要设置编译期间的环境变量可以使用
/opt/shell/cmake.sh -
可以将工具链设置为默认

(CMake) Create the corresponding CMake profile
-
create a new CMake profile, and connect it to your remote toolchain using the Toolchain field:

Alternatively, set the remote toolchain as default and select Use default.
- Apply the changes.
Check and adjust the deployment configuration
-
根据需要修改路径 CLion automatically configures the paths for your project code synchronization. Use the Mappings tab to change the default mappings (for example, to set a particular remote directory for the copied sources instead of the default tmp folder):

-
使用docker时可以选择不同步文件 For this, open the Connection tab and change the
connectiontype toLocal or mounted folder, then set up the path mappings (for Docker, specify the mapped volumes).
Set environment variables
环境变量可以采用以上cmake.sh的方法。
也可以在 .bashrc 中修改。
-
To configure environment variables for the remote OS, specify them in the beginning of the
.bashrcfile, before the# If not running interactively, don't do anythingline.If your primary shell is not bash, follow the instructions for that particular shell or add
PermitUserEnvironment yesto the sshd_config file, restart the sshd service, and then configure the variables in ~/.ssh/environment.