因?yàn)榻?jīng)常在一堆服務(wù)器里面周轉(zhuǎn)罚斗,在編輯文件的時(shí)候就會(huì)出現(xiàn)每個(gè)終端的編輯器配置不統(tǒng)一,比如服務(wù)器A的vim是有行號(hào)、帶語(yǔ)法高亮,而到了服務(wù)器B編輯卻是連vim都沒(méi)裝蛆封,到了服務(wù)器C又發(fā)現(xiàn)縮進(jìn)是八個(gè)空格而不是4個(gè)空格∏箍瘢總之每換一臺(tái)服務(wù)器就像來(lái)到一個(gè)不同的世界桂躏。
更不用說(shuō)有時(shí)候會(huì)遇到重裝碳想,原有的編輯器配置又得一一恢復(fù),好麻煩啊毁靶。
(╯‵□′)╯︵┻━┻
所以就有了此文胧奔,統(tǒng)一所有服務(wù)器的編輯器。做到每一臺(tái)服務(wù)器使用 vim
命令編輯文件都是一樣的編輯器環(huán)境预吆。
先上效果圖:
思路
為了讓全部服務(wù)器的vim編輯器界面一樣(包括插件),所以我們得打包起來(lái)存到一個(gè)地方拐叉,可以讓所有服務(wù)器獲取這個(gè)編輯器的最新版本岩遗。
所以最簡(jiǎn)單的就是丟進(jìn)一個(gè)Docker鏡像里面了。
- 把vim放進(jìn)一個(gè)Alpine鏡像中巷嚣,使用類似下面的命令即可編輯一個(gè)本地當(dāng)前目錄下的文件了喘先。
alias editor='docker run -ti --rm -v $(pwd):/workspace zuolan/vim'
- 配置修改可以通過(guò)環(huán)境變量或者掛載數(shù)據(jù)卷來(lái)實(shí)現(xiàn)。
- 添加插件可以重新構(gòu)建鏡像廷粒,也同樣可以掛載數(shù)據(jù)卷添加插件窘拯。
整體不復(fù)雜,只需要把整個(gè)配置丟進(jìn)去就好了坝茎。
Dockerfile
首先寫 Dockerfile 吧涤姊。
FROM alpine:latest
MAINTAINER zuolan <i@zuolan.me>
ENV HOME /home/user
RUN mkdir -p /home/user/workspace
一步步解釋,上面是新建一個(gè)HOME目錄嗤放,作為容器內(nèi)部的“接口”思喊,以后數(shù)據(jù)卷都會(huì)掛載到這里,然后交給容器內(nèi)部的vim編輯次酌。
繼續(xù)恨课,
RUN apk add --update --no-cache vim && \
rm -rf /var/cache/* /var/log/* /var/tmp/*
ENTRYPOINT ["vim"]
這樣我就有了一個(gè)vim鏡像,當(dāng)然岳服,這是非常簡(jiǎn)陋的剂公,所以接下來(lái)要為它添加一些配置和插件。
REPOSITORY TAG IMAGE ID CREATED SIZE
zuolan/vim latest 3c4a2c3e0aac 45 seconds ago 29.63 MB
修改配置文件與添加 Pathogen
因?yàn)槭侵苯觓pk add安裝吊宋,所以配置文件不出意外就是/etc/vim/vimrc這個(gè)文件了纲辽。
現(xiàn)在補(bǔ)充一下Dockerfile,添加語(yǔ)法高亮以及插件璃搜、縮進(jìn)等等:
RUN ... ... ...
echo "syntax on" >> /etc/vim/vimrc && \
echo "filetype plugin indent on" >> /etc/vim/vimrc
好了拖吼,接下來(lái)安裝 Pathogen,用來(lái)管理vim插件这吻。
RUN apk add --update --virtual curl && \
mkdir -p ~/.vim/bundle ~/.vim/autoload ~/.vim_runtime/temp_dirs && \
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim && \
echo "execute pathogen#infect()" >> /etc/vim/vimrc && \
echo "syntax on" >> /etc/vim/vimrc && \
echo "filetype plugin indent on" >> /etc/vim/vimrc && \
apk del curl && rm -rf /var/cache/* /var/log/* /var/tmp/*
敲黑板吊档!劃重點(diǎn)!這里面有個(gè) --virtual 參數(shù)唾糯,很有意思籍铁,參考資料:
https://github.com/gliderlabs/docker-alpine/blob/master/docs/usage.md#virtual-packages
擴(kuò)展
現(xiàn)在我們繼續(xù)完善涡上,雖然還沒(méi)有插件趾断,但是基本都有了拒名。要實(shí)現(xiàn)上面說(shuō)的讓用戶自定義配置,可以通過(guò)掛載 /etc/vim/vimrc
這個(gè)文件芋酌,以及 ~/.vim/bundle
這個(gè)文件夾增显。
以下純屬個(gè)人自定義了。
# 插件依賴
RUN apk --update add curl ctags git python bash ncurses-terminfo && \
# 安裝 YouCompleteMe
apk add --virtual build-deps go llvm perl cmake python-dev build-base && \
git clone --depth 1 https://github.com/Valloric/YouCompleteMe.git ~/.vim/bundle/YouCompleteMe/ && \
cd ~/.vim/bundle/YouCompleteMe && \
git submodule update --init --recursive && \
~/.vim/bundle/YouCompleteMe/install.py --gocode-completer && \
# 安裝 procvim.vim
git clone --depth 1 https://github.com/Shougo/vimproc.vim.git ~/.vim/bundle/vimproc.vim && \
cd ~/.vim/bundle/vimproc.vim && \
make && \
# 清理
rm -rf ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp /usr/lib/go \
~/.vim/bundle/YouCompleteMe/third_party/ycmd/clang_includes && \
apk del build-deps && \
apk add libxt libx11 libstdc++
RUN cd ~/.vim/bundle/ && \
git clone --depth 1 https://github.com/pangloss/vim-javascript.git && \
... ... ... ...
... ... ... ...
... ... ... ...
... ... ... ...
# 自定義配置
curl -s https://raw.githubusercontent.com/amix/vimrc/master/vimrcs/basic.vim >> /etc/vim/vimrc && \
curl -s https://raw.githubusercontent.com/amix/vimrc/master/vimrcs/extended.vim >> /etc/vim/vimrc && \
sed -i '/colorscheme peaksea/d' /etc/vim/vimrc && \
vim -E -c 'execute pathogen#helptags()' -c q ; return 0
... ... ... ...
... ... ... ...
還有一些地方?jīng)]完成脐帝,明天接著吧同云,果然一個(gè)晚上是搞不定。
(╯‵□′)╯︵┻━┻
ENV TERM=xterm-256color
為啟動(dòng)容器時(shí)的 --tty 這個(gè)啟動(dòng)參數(shù)指定環(huán)境變量堵腹,這個(gè)問(wèn)題在Docker 1.13修復(fù)了炸站,但是這個(gè)變量還是保留一下吧。