前言
在使用 CI 工具进行持续集成的时候, 免不了要定义配置文件, 并在配置文件中定义项目的工作流程. Circle 是一个对开源项目友好的 CI 工具, 本文将以 CircleCI 入手, 解析配置文件中定义 Docker 镜像的配置项: image字段.
对于大多数初次尝试使用 CircleCI 的用户, 最难以拿捏的莫过于使用 docker 镜像时, 配置中 docker 字段下 image 的定义, 本文将介绍如何配置 image 选项 - 使用 CircleCI Convenience Image, 以及与之相关配置的最佳实践.
Convenience Image 的两种类型

语言类镜像
语言类镜像内置了某种语言相关的依赖和工具.
语言类镜像需要在 docker 字段下的第一个 image 字段中定义, 作为执行时的首要容器.
语言类镜像支持的语言列表:
- Android
- Clojure
- Elixir
- Go (Golang)
- JRuby
- Node.js
- OpenJDK (Java)
- PHP
- Python
- Ruby
- Rust
格式
docker:
-image: circleci/language:version[-tag]
配置示例
docker:
-image: circleci/golang:1.9
语言类镜像变体
在语言类镜像的基础上, CircleCI 还提供了这类镜像的变体, 即在提供了某种语言依赖的基础上增加了更多的依赖, 预装了其他的语言和工具
通过添加以下后缀, 就可以使用在某种 Convenience Image 的基础上预置了更多依赖的镜像
-
-node
- 添加了 Nodejs 相关依赖
-
-browsers
- 添加了 浏览器 相关依赖
- includes Chrome, Firefox, Java 8, and Geckodriver
-
-browsers-legacy
- 大致同上, 略有区别
- includes Chrome, Firefox, Java 8, and PhantomJS
-
-node-browsers
- 同时添加了 -node 变体 和 -browser 镜像变体所提供的依赖
-
-node-browsers-legacy
- 同时添加了 -node 变体 和 -browsers-legacy 镜像变体所提供的依赖
配置示例
- image: circleci/node:10-jessie-browsers
服务类镜像
服务类镜像主要是为项目提供服务 (例如数据库服务) 时使用的.
它们必须要在语言类镜像后面定义, 作为次要镜像.
CircleCI 为以下服务提供了服务类镜像
- buildpack-deps
- DynamoDB
- MariaDB
- MongoDB
- MySQL
- PostgreSQL
- Redis
配置示例
- image: circleci/mongo:4.1.7-xenial
服务类镜像变体
CircleCI 仅仅为服务类镜像提供了一种变体, -ram
配置示例
- image: circleci/postgres:9.5-postgis-ram
配置镜像的最佳实践 Best Practices

这是因为 CircleCI Convenience Image 是基于最新版本的上游镜像制作的, 例如镜像 circleci/ruby:2.4-node 是基于最新的 Ruby 2.4-node 容器镜像制作的.
使用最精确的镜像可以避免由于上游的镜像更新而导致的 Convenience Image 的更新从而所带来的不稳定性, 从而保证项目运行环境的稳定性.
配置 Image 的最佳实践就是通过一个额外的标签来固定镜像的版本.
也就是说, 与其使用 circleci/ruby:2.4-node 镜像, 不如加上一个标签 -jessie 或 -stretch 来固定镜像所用的操作系统, 来确保项目使用的镜像是基于某个特定版本的 Debian 系统 ( 例如 circleci/ruby:2.3.7-jessie )
我们也可以通过指定镜像的 SHA 版本来使用最精确的镜像.
使用精确镜像的两种方法:
- 使用一个标签来固定镜像的系统类型
- 使用一个明确的 Docker 镜像 ID
# 最佳实践示例
# 示例 1
# 使用固定系统的镜像
- image: circleci/ruby:2.4.2-jessie-node
# 示例 2
# 使用固定版本镜像
- image:circleci/ruby@sha256:df1808e61a9c32d0ec110960fed213ab2339451ca88941e9be01a03adc98396e
所有 Convenience Image 镜像的可用后缀
请查询该文件: circleci.com/docs/2.0/do…
示例配置
一个应用了 Node.js 语言镜像和 MongDB 服务镜像的 CircleCI 项目配置文件
# .circleci/config.yml
version: 2.1
jobs:
build:
docker:
- image: circleci/node:10.13-jessie-browsers
- image: circleci/mongo:4.0.4-xenial-ram
steps:
- run: echo "A first hello"