ITPub博客

首页 > 大数据 > > 生产力!Docker + IDE 让你不用配置开发环境

生产力!Docker + IDE 让你不用配置开发环境

作者:浪花小雨滴 时间:2020-05-09 11:15:22 0 删除 编辑

很多时候痛苦的不是写代码,而是写代码之前的准备工作!

我相信很多项目配置环境让你花上一整天以上的时间!

话不多说,我们用一个实际的例子来演示。

1. 项目介绍

项目名:Portia

GIthub 地址:github.com/scrapinghub/

这个项目依赖三个服务。

1。后端进程 slyd,负责爬虫服务

2。后端进程 django,负责爬虫管理

3。nginx,用来代理前端静态资源 + 服务转发。

这个项目是基于 node8 + python3.5 + ubuntu 16 + pyqt5 + splash + scrapy + nginx 搭建的。

如果你感兴趣,可以看看他的 dockerFile,你就知道有多么坑爹和难搭。

如果你是 mac 系统,我甚至可以认为你一辈子也不能在本地跑起来(除非用本文的方法)

2. 我们的目标

我们要在本地运行那三个服务,并且不提前配置任何需要的环境。

同时,支持你修改代码,来进行开源项目的迭代和改造。

我们的效果就是不在本地配置任何环境,但是效果和在本地配置环境是一样一样的

我们当然支持 ide,甚至如果你是用的是 pycharm / intelliJ 这种,还支持你打断点调试

3. 思路

pycharm / intellJ 是支持 remote debug 的。我们只要指定远程的 python 解释器,就可以在本地自由运行远程的 python 脚本。

同时 docker 是一个帮我们承载各种环境的容器,docker 本身就附带各种我们不想配置的各种依赖(甚至是 mac 不支持的 linux 的依赖)。

我们可以利用 docker 自带的 -v 参数,来做本地文件和容器内文件的 mapping。这样我们更改本地文件就可以瞬间反应的容器内。

同时因为我们使用了 Pycharm / Intellj 的 remote debug 功能,我们在本地执行的操作就等同于进入容器操作

4. Let's go

首先,我们按照官方文档的建议安装方式,直接在本地执行

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

windows 和 mac 的配置方式可能不同,但是大同小异
注意,我们需要指定是 python3。我们要关闭自动同步。我们要修改映射目录保持和 docker 的 -v 参数相同

5. 运行服务

到了这一步,基本成功了一大半了。还有一些小的收尾工作需要去做。

大家可以看看官方文档入口里启动服务需要的操作,其实主要是设置环境变量/启动 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 上新建对应的两个服务

django 服务的配置
slyd 服务配置

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

可以看到服务成功跑起来了

6. 验证下我们的成果

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

可以看到我们成功的断在了断点处

来看看我们的浏览器的全貌

可以看到服务成功跑了起来。我们没安装那一大堆的 node,python3,pyqt5,sqlash,nginx 等等依赖(如果是 mac 你也安装不起来),依然跑了起来。并且本地改完代码可以迅速反映到服务上(如果开启了 django 的 reload 服务甚至不用重启服务)。并且我们还可以本地打断点。简直是完美~!妈妈再也不用担心我配不对环境了

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3165976/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    39983