在构建中使用 Docker

请注意,由于即将发布的 Docker 速率限制公告,用户将需要将自己的身份验证信息添加到其构建设置或构建配置中,如下所述。

Travis CI 构建可以运行和构建 Docker 镜像,也可以将镜像推送到 Docker 存储库或其他远程存储。

要使用 Docker,请将以下设置添加到您的 .travis.yml

services:
  - docker

然后,您可以将 - docker 命令添加到您的构建中,如以下示例所示。

我们目前不支持在 macOS 上使用 Docker。

有关如何在 Travis CI 企业版中使用 Docker 的信息,请查看 启用 Docker 构建

在构建中使用存储库中的 Docker 镜像 #

示例存储库 运行两个从相同镜像构建的 Docker 容器

  • 一个 Sinatra 应用程序
  • Sinatra 应用程序测试套件

在指定 .travis.yml 中使用 Docker(使用 services: - docker)和 Ruby(使用 language: ruby)后,before_install 构建步骤从 carlad/sinatra 拉取 Docker 镜像,然后运行

cd /root/sinatra; bundle exec foreman start;

在一个从该镜像构建的容器中,映射一些端口和路径。如果您需要复习如何使用 Docker,请阅读 Docker 用户指南

完整的 .travis.yml 如下所示

language: ruby

services:
  - docker

before_install:
- docker pull carlad/sinatra
- docker run -d -p 127.0.0.1:80:4567 carlad/sinatra /bin/sh -c "cd /root/sinatra; bundle exec foreman start;"
- docker ps -a
- docker run carlad/sinatra /bin/sh -c "cd /root/sinatra; bundle exec rake test"

script:
- bundle exec rake test

并产生以下 构建输出

$ docker ps -a
CONTAINER ID        IMAGE                   COMMAND                CREATED                  STATUS                  PORTS                    NAMES
e376792bce99        carlad/sinatra:latest   "/bin/sh -c 'cd /roo   Less than a second ago   Up Less than a second   127.0.0.1:80->4567/tcp   condescending_galileo
$ docker run carlad/sinatra /bin/sh -c "cd /root/sinatra; bundle exec rake test"
/usr/local/bin/ruby -I"lib:test" -I"/usr/local/lib/ruby/2.2.0" "/usr/local/lib/ruby/2.2.0/rake/rake_test_loader.rb" "test/test_app.rb"
Loaded suite /usr/local/lib/ruby/2.2.0/rake/rake_test_loader
Started
.
Finished in 0.022952763 seconds.
------
1 tests, 1 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed
------
43.57 tests/s, 43.57 assertions/s

从 Dockerfile 构建 Docker 镜像 #

您可以从 GitHub 存储库 中的 Dockerfile 直接构建它,而不是从 carlad/sinatra 下载 Docker 镜像。

要构建当前目录中的 Dockerfile,并为其提供相同的 carlad/sinatra 标签,请将 docker pull 行更改为

docker build -t carlad/sinatra .

完整的 .travis.yml 如下所示

language: ruby

services:
  - docker

before_install:
  - docker build -t carlad/sinatra .
  - docker run -d -p 127.0.0.1:80:4567 carlad/sinatra /bin/sh -c "cd /root/sinatra; bundle exec foreman start;"
  - docker ps -a
  - docker run carlad/sinatra /bin/sh -c "cd /root/sinatra; bundle exec rake test"

script:
  - bundle exec rake test

将 Docker 镜像推送到注册表 #

要将镜像推送到 Docker 注册表,必须先通过 docker login 进行身份验证。用于登录的电子邮件、用户名和密码应存储在存储库设置环境变量中,可以通过存储库设置网页或通过 Travis CLI 本地设置,例如

travis env set DOCKER_USERNAME myusername
travis env set DOCKER_PASSWORD secretsecret

请务必使用 travis gem 加密环境变量

在您的 .travis.yml 中,在尝试 docker push 之前,或者可能在 docker pull 私有镜像之前,例如

echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin

基于分支的注册表推送 #

要将存储库的特定分支推送到远程注册表,请使用 .travis.yml 中的自定义部署部分

deploy:
  provider: script
  script: bash docker_push
  on:
    branch: master

其中 docker_push 是您存储库中的一个脚本,其中包含

#!/bin/bash
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
docker push USER/REPO

私有注册表登录 #

当推送到私有注册表时,请务必在 docker login 命令中指定主机名,例如

echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin registry.example.com

使用 Docker Compose #

Docker Compose 工具也安装在启用 Docker 的环境中

如果需要,您可以轻松地替换此预安装的 docker-compose 版本,方法是在 .travis.yml 中添加以下 before_install 步骤

env:
  - DOCKER_COMPOSE_VERSION=v2.17.3

before_install:
  - sudo rm /usr/local/bin/docker-compose
  - curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose
  - chmod +x docker-compose
  - sudo mv docker-compose /usr/local/bin

安装较新版本的 Docker #

您可以通过在 .travis.ymlbefore_install 步骤中手动更新它来升级到最新版本并使用任何新的 Docker 功能

从 download.docker.com 更新

before_install:
  - sudo systemctl stop docker.service && sudo systemctl stop docker.socket
  - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  - yes | sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  - sudo apt-get update
  - sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce

或者,您也可以使用 addons 而不是 before_install 通过 apt 进行更新

addons:
  apt:
    packages:
      - docker-ce

使用 docker --version 检查您正在运行的 Docker 版本

示例 #