在使用 CI 工具进行持续集成的时候, 免不了要定义配置文件, 并在配置文件中定义项目的工做流程. Circle 是一个对开源项目友好的 CI 工具, 本文将以 CircleCI 入手, 解析配置文件中定义 Docker 镜像的配置项: image字段.node
对于大多数初次尝试使用 CircleCI 的用户, 最难以拿捏的莫过于使用 docker 镜像时, 配置中 docker 字段下 image 的定义, 本文将介绍如何配置 image 选项 - 使用 CircleCI Convenience Image, 以及与之相关配置的最佳实践.golang
语言类镜像内置了某种语言相关的依赖和工具.docker
语言类镜像须要在 docker 字段下的第一个 image 字段中定义, 做为执行时的首要容器.数据库
docker:
-image: circleci/language:version[-tag]
复制代码
docker:
-image: circleci/golang:1.9
复制代码
在语言类镜像的基础上, CircleCI 还提供了这类镜像的变体, 即在提供了某种语言依赖的基础上增长了更多的依赖, 预装了其余的语言和工具json
经过添加如下后缀, 就可使用在某种 Convenience Image 的基础上预置了更多依赖的镜像浏览器
-noderuby
-browsersbash
-browsers-legacy工具
-node-browserspost
-node-browsers-legacy
- image: circleci/node:10-jessie-browsers
复制代码
服务类镜像主要是为项目提供服务 (例如数据库服务) 时使用的.
它们必需要在语言类镜像后面定义, 做为次要镜像.
CircleCI 为如下服务提供了服务类镜像
- image: circleci/mongo:4.1.7-xenial
复制代码
CircleCI 仅仅为服务类镜像提供了一种变体, -ram
- image: circleci/postgres:9.5-postgis-ram
复制代码
这是由于 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 版原本使用最精确的镜像.
# 最佳实践示例
# 示例 1
# 使用固定系统的镜像
- image: circleci/ruby:2.4.2-jessie-node
# 示例 2
# 使用固定版本镜像
- image:circleci/ruby@sha256:df1808e61a9c32d0ec110960fed213ab2339451ca88941e9be01a03adc98396e
复制代码
请查询该文件: 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"
复制代码