在 Docker 容器中编辑文件

我希望每次在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:

zedrem remote

比起来,docker化的本地服务器更快更安全 :

zedrem 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的搭建Gitlab CI 全过程详解

Docker安装应用(CentOS 6.5_x64)

Docker 和一个正常的虚拟机有何区别?

在 Docker 中使用 MySQL

Docker 将改变所有事情

Docker安装应用(CentOS 6.5_x64)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a0f938111c77a11de0024a3a7660facc.html