在「Ansible 用 Docker 練習(xí) Ansible」一章時(shí),曾提到可以用 Ansible 建置 Docker image。接下來(lái)凍仁將借由 chusiang.vim-and-vi-mode
role 講解 Dockerize (Docker 化) Ansible role 的小技巧。
chusiang.vim-and-vi-mode
是用來(lái)安裝 Vim 和設(shè)置 vi-mode 的 Ansible Role,目前支持的平臺(tái)有 Ubuntu, Debian, CentOS 和 macOS。
對(duì)于凍仁這位 Vim 重度使用者而言,會(huì)想在各個(gè)環(huán)境都使用 vi-mode,索性就寫(xiě)了一個(gè) Role 來(lái)處理這些索碎的操作。
與之前 Roles 的范例相比,這次多了 builds/
目錄和各個(gè)發(fā)行版本的 Dockerfile
。
$ tree .
.
├── LICENSE
├── README.md
├── Vagrantfile
├── builds
│ ├── centos6
│ │ └── Dockerfile
│ ├── centos7
│ │ └── Dockerfile
│ ├── debian7
│ │ └── Dockerfile
│ ├── debian8
│ │ └── Dockerfile
│ ├── ubuntu14.04
│ │ └── Dockerfile
│ └── ubuntu16.04
│ └── Dockerfile
├── defaults
│ └── main.yml
├── meta
│ └── main.yml
├── setup.yml
├── tasks
│ ├── main.yml
│ ├── use-apt.yml
│ ├── use-brew.yml
│ └── use-yum.yml
├── templates
│ └── gitconfig.j2
└── ...
Dockerfile
是我們使用 docker build
指令建置 image 會(huì)用到的檔案。這邊只以 Ubuntu 14.04 的 Dockerfile 進(jìn)行解說(shuō),如想深入了解還請(qǐng)參考 Dockerfile reference | Docker 一文。
$ vi builds/ubuntu14.04/Dockerfile
01 # pull base image
02 FROM williamyeh/ansible:ubuntu14.04-onbuild
03 MAINTAINER Chu-Siang Lai <chusiang.lai@gmail.com>
04
05 #
06 # build phase
07 #
08 RUN sed -i -e 's/exit\s\s*101/exit 0/' /usr/sbin/policy-rc.d
09
10 # init.
11 RUN sudo apt-get install -y curl git make ;\
12 git clone https://github.com/chusiang/vim-and-vi-mode.ansible.role.git ;\
13 cd vim-and-vi-mode.ansible.role
14
15 ENV PLAYBOOK vim-and-vi-mode.ansible.role/setup.yml
16 RUN ansible-playbook-wrapper -vvv
williamyeh/ansible:ubuntu14.04-onbuild
。curl
, git
, make
套件和取得 Playbooks 等事先作業(yè)。有了 Dockerfile,我們就可借由 docker build
指令建置 docker imgae。
進(jìn)入 builds/ubuntu14.04/
的目錄。
$ cd builds/ubuntu14.04
建置 docker image。
$ docker build -t vim:ubuntu14.04 .
...
PLAY RECAP *********************************************************************
localhost : ok=10 changed=7 unreachable=0 failed=0
---> 22b40b4e3b03
Removing intermediate container 9e4dff0b5ddf
Successfully built 22b40b4e3b03
列出 docker image,成功后應(yīng)與以下結(jié)果雷同。
$ docker images | grep vim
REPOSITORY TAG IMAGE ID CREATED SIZE
vim ubuntu14.04 22b40b4e3b03 14 minutes ago 396.9 MB
以上即是使用 Ansible 建置 Docker image 的示范,下章凍仁將介紹怎么把這一套流程搬到 Docker Hub 上。
Dockerfile + Shell Script 的組合雖好,可步驟一多就會(huì)顯得雜亂且難以維護(hù),這時(shí)就是 Ansible 出場(chǎng)的時(shí)候了!
透過(guò) Ansible 我們可以很快速的把環(huán)境移植到 Docker 上,若需針對(duì) Docker 進(jìn)行微調(diào),相信底下的范例可以幫上不少忙。
# 在 Docker 虛擬環(huán)境時(shí),不執(zhí)行更改主機(jī)名稱(chēng) (hostname) 的 task。
- name: rename hostname
hostname: name=vim.local
when: ansible_virtualization_type != 'docker'
更多建議: