[经验]如何优雅的在docker下断点调试debug
纲领
- 前言
- 使用
- 过程
- 配置
- 总结
前言
随着docker的普及,现在更多的生产线上的程序都是打包成docker 应用,这样方便环境的隔离,也能提高资源的利用率,不过一旦出了问题,怎么debug就成了一个难题,我可暂时没有学会大神们的pdb debug大法,只会用pycharm 打断点调试,那如何处理呢,pycharm professional (只有这个版本里面有这个功能,社区版是没有的) 有一个remote debug 功能,如果我们使用这个功能,那是不是可以同样套路上docker 应用呢?当然可以,我们姑且将docker 当成一个真实的机器
准备
- docker
- pycharm professinal
- docker-compose
- ubuntu 16.04 系统
使用
最近我正在改nvidia 官方的一个可视化机器学习的web框架 digits ===> https://github.com/NVIDIA/DIGITS(可以轻松的训练) 本次操作就以它来演示
准备基础镜像
因为官方已经提供了他的官方镜像,所以我们直接拉镜像就可以了
sudo docker pull nvidia/digits:5.0
准备debug相关资料
新建一个debug 文件夹
mkdir debug_wukong
在debug_wokong
下新建 Dockerfile
FROM nvidia/digits:5.0
RUN apt-get update
RUN apt-get -q -y install openssh-server python-pip python-tk build-essential python-dev
RUN mkdir /var/run/sshd
RUN sed "s/without-password/yes/g" /etc/ssh/sshd_config > /etc/ssh/sshd_config2
RUN cp /etc/ssh/sshd_config2 /etc/ssh/sshd_config
RUN echo 'root:root' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
WORKDIR /workspace
ENTRYPOINT /usr/sbin/sshd && bash
EXPOSE 22
准备docker-compose.yml
文件
version: "2"
services:
debug_wukong:
build: .
ports:
- "8083:8080"
- "9999:22"
environment:
- RUNENV=production
这里,我们将应用的端口暴露出来,宿主机的9999 与虚拟机的22端口绑定在一起了
build debug的镜像
在debug_wukong
文件夹下,我们就有如下的文件了
.
|-- Dockerfile
|-- docker-compose.yml
使用命令sudo docker-compose build
耐心等待,这样我们就可以在原来的镜像基础之上生成一个新的可以debug的镜像
进入镜像
在debug_wukong
文件夹下,使用命令
docker-compose run --service-ports debug_wukong bash
这样我们就可以顺利的进入docker 的内部环境了,这个时候,当前的bash 已经进入到了docker 内部,我们在开另外一个bash命令窗口,使用命令docker ps -a
, 可以方便的看到当前的内容
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1f9f2174eb0 debugwukong_debug_wukong "/bin/sh -c '/usr/..." 22 hours ago Up 22 hours 5000/tcp, 0.0.0.0:9999->22/tcp, 0.0.0.0:8083->8080/tcp debugwukong_debug_wukong_run_1
包括我们当前起的docker 名称
当前状态
这个时候,我们的虚拟机(容器)内部端口22 (ssh) 和宿主机的9999绑定了,内部的应用端口8080和外部的8083绑定在了一起
配置
配置目录
我们使用pycharm打开我们的项目文件,(我这边的文件夹已经改成wukong了),先把菜单栏的
Tools -> Deployment -> Configration
如图所示:
- sftp host : 我们远程debug的host地址,我这里就直接填本地了 127.0.0.1
- port : 9999 记得我们开放的9999(实际和docker 里面的绑定的22端口了吧)
- Root path: 映射的地址
- User name : 我们的用户名
- Password: 密码也是root (用户名和密码我们都已经在dockerfile里面写好了)
配置python path
菜单栏
Pycharm -> Preferences -> Project -> Project interpreter
我们选择右边的"选项图标",会出现
Add remote
填好我们之前的参数 ,这样就会方便的将我们的环境与远程环境同步,这个时候我们就可以方便的使用remote 的python 编译器执行我们的本地脚本了
同步本地代码到docker内部
选择upload 选项,就样就会将本地的代码同步到docker内部环境,以后修改记得同步到远程环境
补充
现在更新了一个新的ubuntu 18.04的base镜像
# Just for debug
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:root' |chpasswd
RUN sed -ri 's/^#?PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
RUN mkdir /root/.ssh
RUN apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
EXPOSE 22
ENTRYPOINT /usr/sbin/sshd && bash
总结
本次主要从dockerfile的制作,docker-compose 使用,以及pycharm 的配置来介绍我们的一大日常工作中的常用利器,remote debug ,学会这个技能,对于我们的工作还是有不小的帮助的。10.1 国庆节在即,大鱼在这里提前祝大家国庆快乐,出行注意安全。
- 原文作者:大鱼
- 原文链接:https://brucedone.com/archives/1088/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. 进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。