我希望每次在docker容器中安装vi的时候谁会给我1美元...我想要一个在运行的docker容器编辑文件的更简单的方式。首先,尝试避免编辑文件,这违背了容器的哲学理念(见最后一段)。
但是如果你有一个正当的理由,下面教你怎么做。
为什么是Zedapp?很多时候我使用vi或Atom,就在几个月前我偶然发现了Zedapp,一个自用编辑器。它简化了编辑,比如不使用tabs,减少了编辑时的识别加载。
对于远程编辑的良好支持使它从远程服务器中脱颖而出, 它甚至可以直接编译github源。
Zedapp 刚有version 1.0,如果你喜欢它,可以考虑帮助在gratipay的Zef Hemmel,他勇敢地辞掉了自己的工作,投身于开源项目。
安装Zedapp你可以将Zedapp作为chrome插件或者一个独立的app。 在这里下载: zedapp.org。 建议使用独立版本。
安装 zedrem你需要zedrem来远程编辑,它是为Zedapp编辑文件提供服务的一个小程序. Zedrem 打包在docker镜像中:sequenceiq/zedapp
这里有一个脚本,帮助在本地运行zed服务器,在目标容器运行zed客户端: zed
安装docker镜像和shell脚本:
docker run --rm \
-v /usr/local/bin:/target \
-v /usr/local/bin/docker:/usr/local/bin/docker \
-v /var/run/docker.sock:/var/run/docker.sock \
sequenceiq/zedapp
实际上只有一个单独的二进制zedrem, 我用术语:zed服务器和zed客户端在你使用它或者没有--server 选项的时候加以区分。
现在你已经可以启用一个zedrem会话来编辑Docker容器目录内的Zedapp文件了。
启用zedrem会话
在容器中启用zedrem会话
zed <container> <directory>
如果zedrem服务器未启用,它将-start(启用)zedrem服务器 ,把zedrem客户端– copy(复制)在选择的容器中并启用 ,最后输出zedrem会话的远程链接。
导向工程列表窗口:Command-Shift-O/Ctrl-Shift-O. 选择Remote Folder, 在Zedrem URL输入框中键入远程链接,点击Open.
这就是全部,玩的开心!下面的段落是为了满足你们的好奇心。
Boot2docker 帮助函数Install zedrem这一步可能已经检测到你在使用Boot2docker并指导你创建了一个帮助函数,以防你错过了这一步或谨为参考:
zed() { boot2docker ssh "sudo zed $@" ; }
Boot2docker中安装的的zed帮助脚本需要这一句,所以你需要boot2docker ssh工作区。
在此之后,你可以直接在OSX系统上进行操作。
zed <container> <directory>
本地zedrem 服务器
当你想使用Zedapp实现远程编辑时,默认需要其他两个组件:
zedrem服务器 Zedapp得到文件内容,发送web服务协议的编辑命令,维护和zedrem客户端的会话。
zedrem客户端 在指定的路径中为文件服务的小程序。
当通过官方服务器使用zedrem客户端时,所有的编辑命令和内容都要经过blobe:
比起来,docker化的本地服务器更快更安全 :
nsenter
你可能在想这一步:copy zedrem into the container(将zedrem复制到容器)。怎么可能?Docker的cp命令只支持反方向:从容器到本地目录。
这是一个开源问题,很快会修复,但是同时你可以使用nesenter救急。Jérôme Petazzoni提供了一个带有帮助脚本:docker-enter包装好的nsenter。我们可以使用docker-enter将文件从本地复制到容器:
cat local-file | docker-enter $container sh -c 'cat>/zedrem'
by the way(顺便说一下):docker exec已经合并在主分支里了,它将全面替代nsenter。
千万别这么干绝大多数场合你们不需要这么做。首先在容器中编辑文件而不是开发或调试被认为是糟糕的实践。
发现你正在编辑nginx的配置文件? 别, 使用Jeff Lindsay的nginx appliance。
如果你真的需要在docker容器中编辑文件,请使用卷。
如果你已经启用了一个容器,并且有问题的文件又不在一个卷上,这个方法还是很好用的。
CentOS 6/7系列安装Docker
在 Docker 中使用 MySQL