首页 > 大数据 > > 生产力!Docker + IDE 让你不用配置开发环境
很多时候痛苦的不是写代码,而是写代码之前的准备工作!
我相信很多项目配置环境让你花上一整天以上的时间!
话不多说,我们用一个实际的例子来演示。
项目名:Portia
GIthub 地址:https://github.com/scrapinghub/portia
这个项目依赖三个服务。
1。后端进程 slyd,负责爬虫服务
2。后端进程 django,负责爬虫管理
3。nginx,用来代理前端静态资源 + 服务转发。
这个项目是基于 node8 + python3.5 + ubuntu 16 + pyqt5 + splash + scrapy + nginx 搭建的。
如果你感兴趣,可以看看他的 dockerFile,你就知道有多么坑爹和难搭。
如果你是 mac 系统,我甚至可以认为你一辈子也不能在本地跑起来(除非用本文的方法)
我们要在本地运行那三个服务,并且不提前配置任何需要的环境。
同时,支持你修改代码,来进行开源项目的迭代和改造。
我们的效果就是不在本地配置任何环境,但是效果和在本地配置环境是一样一样的
我们当然支持 ide,甚至如果你是用的是 pycharm / intelliJ 这种,还支持你打断点调试
pycharm / intellJ 是支持 remote debug 的。我们只要指定远程的 python 解释器,就可以在本地自由运行远程的 python 脚本。
同时 docker 是一个帮我们承载各种环境的容器,docker 本身就附带各种我们不想配置的各种依赖(甚至是 mac 不支持的 linux 的依赖)。
我们可以利用 docker 自带的 -v 参数,来做本地文件和容器内文件的 mapping。这样我们更改本地文件就可以瞬间反应的容器内。
同时因为我们使用了 Pycharm / Intellj 的 remote debug 功能,我们在本地执行的操作就等同于进入容器操作
首先,我们按照官方文档的建议安装方式,直接在本地执行
docker run -i -t -v <path-to-local-portia>:/app -p 9001:9001 -p 10002:22 --name "my_code" --entrypoint "/bin/bash" scrapinghub/portia注意,我这里有几个和官方文档不一样的改动。一个是,我将本地的代码目录映射到了容器的 /app 目录。这个你可以自行更改。我这么做是因为代码里面有一些环境变量配的是 /app 目录,纯属为了方便才这么做。我们更改了 entrypoint,是不想按照默认的启动方式启动服务,方便我们后续做些定制化的需求。
另一个是我映射了本地的 10002 端口到容器的 22 端口。这是因为我们的 IDE 的 remote debug 需要开启 ssh 服务。
下一步,我们需要支持下容器的 ssh 服务。因为官方的镜像默认是没有开启 ssh 的。
docker exec -it my_code /bin/bash # 进入容器内部
root@1fc83668d9e8: apt-get update && apt-get install vim ssh # 安装 vim 和 ssh
root@1fc83668d9e8: service ssh start # 开启 ssh 服务
root@1fc83668d9e8: mkdir -p ~/.ssh
root@1fc83668d9e8: echo "<your local ssh public key>" > ~/.ssh/authorized_keys # 将你本地的公钥拷贝到容器的可识别公钥内这样,我们就可以在本地以 ssh 的方式,从 10002 端口连接我们的容器了
下面,我们需要在 pycharm 配置 remote debug 的配置。
首先我们用 pycharm 打开你的本地仓库(docker 配置的本地映射位置),然后我们进入 settings。
按照下图我们来新建一个 remote interpreter


到了这一步,基本成功了一大半了。还有一些小的收尾工作需要去做。
大家可以看看官方文档入口里启动服务需要的操作,其实主要是设置环境变量/启动 nginx/启动slyd服务,启动 django 服务,之后我们的服务就彻底跑起来了

首先,参考 entry 文件,我们需要指定一些额外的 python path。主要是为了防止我们的服务找不到对应的 import 位置。也可以在代码中 sys.path.append,他们的效果是一样的。出于方便,我们也可以直接在 IDE 的 settings 里配置 PYTHONPATH。总之方法很多,选择一种就好

接下来,我们去容器里开启 nginx 服务
docker exec -it my_code /bin/bash
root@1fc83668d9e8: service nginx start我们在本地的 IDE 上新建对应的两个服务


ok,到了这里我们依次启动两个服务就OK了



我们本地 IDE 打个断点,然后去浏览器输入主页,看看能不能断在断点处


可以看到我们成功的断在了断点处
来看看我们的浏览器的全貌

可以看到服务成功跑了起来。我们没安装那一大堆的 node,python3,pyqt5,sqlash,nginx 等等依赖(如果是 mac 你也安装不起来),依然跑了起来。并且本地改完代码可以迅速反映到服务上(如果开启了 django 的 reload 服务甚至不用重启服务)。并且我们还可以本地打断点。简直是完美~!妈妈再也不用担心我配不对环境了
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3165976/ ,如需转载,请注明出处,否则将追究法律责任。