docker的核心理念就是:Build once,run anywhere。对于Vimer来说,这无疑是一个好消息。大家都知道,虽说有vimrc
在手,但有些插件的安装并不是那么容易,需要进行各种预处理和后处理;某些插件在不同发行版上的表现也不一致。一旦切换到新环境,一时半会儿肯定上不了手,如果缺乏网络支持,那更是捉襟见肘。
基于以上几点考虑,设想可以通过docker打包vim,构建一个镜像,将其作为自己的开发环境。当切换到新机器时,只需要在该机器上运行这个镜像,便可立即开启一个专属于自己的开发环境。我在github上开放了一个示例,供参考,也可以直接下载容器体验:docker pull docker.io/schnauzers/vim:latest
。这篇文章简单介绍一下思路。
- 编写Dockerfile
其实所有工作都可以在Dockerfile里编写,但为了少加载一些临时container(docker镜像构建过程中,每条指令都在一个临时container中运行),也为了可读性考虑,我在Dockerfile中仅仅是将一些文件拷贝到容器中,例如vimrc
等,并调用实际的构建脚本install.sh
。
FROM docker.io/centos:7.3.1611
ADD ./install.sh /usr/local
ADD ./vimrc /root/.vimrc
#运行install.sh脚本进行实际的安装工作
RUN /usr/local/install.sh
- 编写安装脚本
install.sh
一般情况下,编辑完vimrc文件后,vim环境构建过程为:安装依赖的系统组件、在vim中安装插件、安装插件运行所需要的一些组件。这个install.sh
脚本就是用来做这些事的。
# 安装所有依赖的组件
yum install vim git curl ctags...
echo "-->download vundle to manage vim plugins..."
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
...
# 安装vim插件
vim -c PluginInstall -c q -c q
# 安装插件运行需要依赖的一些组件
cd /root/.vim/bundle/YouCompleteMe/ && python install.py --clang-complete
...
- 构建容器
准备工作完成后,调用docker build
命令,就可以构建开发环境镜像了(假设镜像名字为:docker.io/schnauzers/vim)。
docker build --rm -t docker.io/schnauzers/vim .
镜像制作完成后,如果注册了hub.docker.com
的账号,可通过docker push
命令将其推送到仓库中。
- 使用开发环境
通过docker pull
命令,或者docker save/load
命令,可将制作好的镜像转移到另一台主机上。接着通过如下命令,将主机代码目录(/home)挂载到容器中(/mnt),便可以在自己的开发环境里编辑代码了:
docker run -v /home:/mnt -it docker.io/schnauzers/vim bash
如果想让该容器长期在主机上驻留,可以通过-d
选项开启容器,之后在打算进行开发时,通过docker exec
命令进入即可:
# tail -f /dev/null命令让容器不至于立刻退出
docker run -d /home:/mnt -it docker.io/schnauzers/vim tail -f /dev/null
# 登录运行在后台的容器
docker exec -it docker.io/schnauzers/vim bash