https://blog.csdn.net/u014645632/article/details/70918475/
https://www.cnblogs.com/yeqing112/p/10773500.html
https://medium.com/exampro/how-to-setup-and-ssh-into-alpine-linux-virtual-box-51be296ff710 ssh
vim因其丰富的插件和强大的配置功能在创建开发环境的自由度上确实非其它编辑器和IDE能比。之所以要用docker创建一个vim开发环境,因为docker轻量,简单,便于管理。在一个镜像里配置好vim后,上传到自己的仓库里,这样换台主机后不用再从头安装插件配置环境,而是直接在docker里把镜像下载下来。
考虑到最后生成的镜像体积一定要小,所以不选用ubuntu或是centos系统,而是使用轻量级linux操作系统alpine,只有几兆 大小。实际上docker hub上有基于alpine的vim镜像,jare/vim-bundle ,本文很多地方也参考了其Dockerfile的写法。这个镜像集成了很多vim插件,但是唯独YouCompleteMe会报错,而我之前已经习惯了YCM这个神器,所以重新做了一个。
1.安装vim
因为YCM需要vim支持python,并且要保证vim版本在7.4以上,所以通常需要重新编译vim。而编译需要安装build-base,make等工具,alpine使用指令apk add 下载并安装软件,类似ubuntu的apt-get install 。但是默认的源是国外网址,比较慢,所以可以修改/etc/apk/repositories 换源,我使用的是阿里云镜像地址,如下:
http://mirrors.aliyun.com/alpine/v3.6/main
http://mirrors.aliyun.com/alpine/v3.6/community
于是在Dockerfile中这么写就可以安装支持python的vim了。
FROM alpine:latest
ADD repositories /etc/apk/repositories
RUN apk update
RUN apk add build-base \
ctags \
git \
libx11-dev \
libxpm-dev \
libxt-dev \
make \
ncurses-dev \
python \
python-dev
#build vim
RUN cd /tmp \
&& git clone https://github.com/vim/vim \
&& cd /tmp/vim \
&& ./configure \
--disable-gui \
--disable-netbeans \
--enable-multibyte \
--enable-pythoninterp \
--prefix /usr \
--with-features=big \
--with-python-config-dir=/usr/lib/python2.7/config \
&& make install \
&& cp /usr/share/vim/vim80/vimrc_example.vim ~/.vimrc
最后一步我们将vimrc_example.vim拷贝到根目录下的.vimrc文件,作为我们vim的配置文件。之后对vim的一些配置都写到/root/.vimrc文件中。
2.安装YCM
首先要有一个总的流程的概念。YCM之所以有那么强大的补全和调试功能,是因为其基于clang,可以对代码文本实时地分析。我们从github上下载了YCM的源码后,可以按照官方文档上说的那样直接运行安装脚本./install.py --clang-completer进行安装,但这种方法是直接下载编译好的libclang.so,并生成一个ycm_core,而通常情况下(除非你人品好到炸),YCM安装好了却没有基于语义补全的功能。
你可以在vim中输入YcmDebugInfo来检查YCM是否有错误,以及输入YcmToggleLogs **stderror**.log 来查看错误日志。很可能出现的报错是:
Full error: libtinfo.so.5: cannot open shared object file: No such file or directory
这种报错就说明libclang没有安装好。
另一种方法就是不运行安装脚本,而是自己编译ycm_core,并在编译时指定自己安装的libclang。这里简书上有篇文章详细说明了这种方法,一步一步带你安装史上最难安装的 vim 插件 —— YouCompleteMe
然而不知为何,如果不运行install.py,即便自己安装了libclang,在进行编译ycm_core时依旧提示找不到libclang.so。于是我采用了一个折衷的办法,就是运行install.py之后用/usr/lib/libclang.so代替../third_party/ycmd/libclang.so,终于运行YCM不再报错。
于是可以在Dockerfile中这么写
#build ycm
RUN apk add clang cmake
RUN git clone --depth 1 https://github.com/Valloric/YouCompleteMe /root/.vim/bundle/YouCompleteMe \
&& cd /root/.vim/bundle/YouCompleteMe \
&& git submodule update --init --recursive \
&& ./install.py --clang-completer
RUN cp ~/.vim/bundle/YouCompleteMe/third_party/ycmd/examples/.ycm_extra_conf.py ~/.vim/ \
&& cd ~/.vim/bundle/YouCompleteMe && cp -r autoload plugin third_party python /root/.vim \
&& cp /usr/lib/libclang.so.4.0 ~/.vim/third_party/ycmd/
3 配置,清除,创建容器
配置vimrc如下:
#config .vimrc
RUN echo "let g:ycm_server_python_interpreter='/usr/bin/python2.7'" >> /root/.vimrc \
&& echo "let g:ycm_global_ycm_extra_conf='~/.vim/.ycm_extra_conf.py'" >> /root/.vimrc \
&& echo "let g:ycm_seed_identifiers_with_syntax=1" >> /root/.vimrc \
&& echo "set completeopt-=preview" >> /root/.vimrc
还要删除多余的文件以减小镜像体积。然而最后创建的镜像仍然有1个多G,显然太大了,不知道还有没有好的办法进一步减小镜像体积。
#clear
RUN rm -r /root/.vim/bundle/YouCompleteMe
RUN rm -r /tmp/vim
设置entrypoint如下:
#entrypoint
#RUN cd /usr/local/bin && touch run && echo "cd /home">>run && echo "vim $@">>run && chmod +x run
于是就使用指令docker run -ti --rm -v $(pwd):/home your_image_name创建一个临时的YCM容器了。
我们在进行URLOS应用开发时,经常会用到一些基础系统镜像,如:ubuntu、CentOS、Debian等,我们可以通过docker pull命令直接拉取官方镜像。
root@ubuntu:~# docker pull ubuntu:18.04 18.04: Pulling from library/ubuntu 898c46f3b1a1: Already exists 63366dfa0a50: Already exists 041d4cd74a92: Already exists 6e1bee0f8701: Already exists Digest: sha256:017eef0b616011647b269b5c65826e2e2ebddbe5d1f8c1e56b3599fb14fabec8 Status: Downloaded newer image for ubuntu:18.04 root@master-node:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 94e814e2efa8 6 weeks ago 88.9MB
root@ubuntu:~#
以上是从docker官方拉取的ubuntu18.04镜像,我们可以基于此镜像制作相关的应用,比如LNP网站环境、LAP网站环境、Nodejs环境等等。简单理解,就是说几乎所有的docker应用都是在这些镜像上层层打包后得到的,应用的最终体积也许有几百M甚至上G,我们如何为应用瘦身以减少对磁盘的消耗呢?
docker官方为我们打造了Alpine。
Alpine 的意思是“高山的”,比如 Alpine plants高山植物,Alpine skiing高山滑雪、the alpine resort阿尔卑斯山胜地,其实Alpine是一个操作系统。
Alpine 操作系统是一个面向安全的轻型 Linux 发行版。目前 Docker 官方已开始推荐使用 Alpine 替代之前的 Ubuntu 做为基础镜像环境。这样会带来多个好处。包括镜像下载速度加快,镜像安全性提高,主机之间的切换更方便,占用更少磁盘空间等。
Alpine的特点:
1、小巧:基于Musl libc和busybox,和busybox一样小巧,最小的Docker镜像只有5MB;
2、安全:面向安全的轻量发行版;
3、简单:提供APK包管理工具,软件的搜索、安装、删除、升级都非常方便。
4、适合容器使用:由于小巧、功能完备,非常适合作为容器的基础镜像。
在制作URLOS应用时,我们可以选择Alpine作为系统基础镜像,这样一来可有效降低应用的大小,方便其他用户下载安装。现在我们开始使用Alpine(如果你的系统中没有安装docker,建议先安装URLOS,因为它自带了docker)。
docker下运行Alpine
使用docker pull命令拉取Alpine镜像
root@ubuntu:~# docker pull alpine Using default tag: latest latest: Pulling from library/alpine bdf0201b3a05: Pull complete Digest: sha256:28ef97b8686a0b5399129e9b763d5b7e5ff03576aa5580d6f4182a49c5fe1913 Status: Downloaded newer image for alpine:latest
root@ubuntu:~#
使用docker images命令查看镜像
root@ubuntu:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest cdf98d1859c1 2 weeks ago 5.53MB
ubuntu 18.04 94e814e2efa8 6 weeks ago 88.9MB
root@ubuntu:~#
可以看到alpine镜像只有5.53MB,而ubuntu镜像则有88.9MB,Alpine的体积优势非常明显。
下面运行镜像
root@ubuntu:~# docker run -it --name myalpine alpine / #
Alpine的基本配置
1、网络相关配置
主机名文件
/etc/hostname
使用新设置的主机名立刻生效,执行如下命令:
hostname -F /etc/hostname
主机IP和域名映射文件
/etc/hosts
文件内容为:
127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 a9efe865a8e6 192.168.43.121 www.urlos.com
DNS 服务器配置文件
/etc/resolv.conf
文件内容为:
#neeanew Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN nameserver 192.168.43.1
网卡配置文件
/etc/network/interfaces
文件内容为:
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.43.121 netmask 255.255.255.0 gateway 192.168.43.1
修改完相关配置以后,重新启动网络服务:
/etc/init.d/networking restart
2、更新国内源
Alpine的源文件为:
/etc/apk/repositories
默认的源地址为:http://dl-cdn.alpinelinux.org/
可以编辑源文件 /etc/apk/repositories
采用国内阿里云的源,文件内容为:
https://mirrors.aliyun.com/alpine/v3.6/main/
https://mirrors.aliyun.com/alpine/v3.6/community/
如果采用中国科技大学的源,文件内容为:
https://mirrors.ustc.edu.cn/alpine/v3.6/main/
https://mirrors.ustc.edu.cn/alpine/v3.6/community/
软件包管理工具apk的基本使用
alpine 提供了非常好用的apk软件包管理工具,
可以方便地安装、删除、更新软件。
查询相关的软件包
命令:apk search,如查询vim软件包:
/ # apk search vim neovim-doc-0.2.0-r0
faenza-icon-theme-vim-1.3.1-r4
docker-vim-17.05.0-r0
vim-doc-8.0.0595-r0
py-jinja2-vim-2.9.6-r0
vimdiff-8.0.0595-r0
asciidoc-vim-8.6.9-r2
neovim-lang-0.2.0-r0
vim-8.0.0595-r0
neovim-0.2.0-r0
nginx-vim-1.12.2-r2
msmtp-vim-1.6.6-r1
protobuf-vim-3.1.0-r1
gst-plugins-base1-1.10.4-r1
mercurial-vim-4.5.2-r0
/ #
安装软件包
命令:apk add,如安装vim软件包:
/ # apk add vim (1/5) Installing lua5.2-libs (5.2.4-r2)
(2/5) Installing ncurses-terminfo-base (6.0_p20171125-r1)
(3/5) Installing ncurses-terminfo (6.0_p20171125-r1)
(4/5) Installing ncurses-libs (6.0_p20171125-r1)
(5/5) Installing vim (8.0.0595-r0)
Executing busybox-1.29.3-r10.trigger
OK: 39 MiB in 19 packages
/ #
卸载软件
命令:apk del,如卸载vim软件:
/ # apk del vim (1/5) Purging vim (8.0.0595-r0)
(2/5) Purging lua5.2-libs (5.2.4-r2)
(3/5) Purging ncurses-libs (6.0_p20171125-r1)
(4/5) Purging ncurses-terminfo (6.0_p20171125-r1)
(5/5) Purging ncurses-terminfo-base (6.0_p20171125-r1)
Executing busybox-1.29.3-r10.trigger
OK: 6 MiB in 14 packages
/ #
获取更多apk包管理的命令参数
命令:apk --help
以上是Alpine最基本的使用方法,更多URLOS开发教程与docker容器教程请访问URLOS官网获取。
URLOS官网:https://www.urlos.com/
URLOS安装方法:https://www.urlos.com/center-home-index-detail-10-22-y.html
URLOS开发交流QQ群:695164700,147882180
URLOS微信公众号: