在构建中使用 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.yml
的 before_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 版本
示例 #
- heroku/logplex(Heroku 日志路由器)
- kartorza/docker-pg-backup(一个 cron 作业,用于备份在 docker PostgreSQL 容器中运行的数据库)