36 个版本

0.3.6 2021 年 5 月 10 日
0.3.4 2020 年 9 月 23 日
0.3.0-alpha.32020 年 4 月 10 日
0.2.7 2019 年 1 月 12 日
0.1.10 2016 年 11 月 13 日

开发工具 中排名第 569

Download history 9/week @ 2024-03-09 1/week @ 2024-03-16 81/week @ 2024-03-30 8/week @ 2024-04-06

每月下载量 80

MIT/Apache

285KB
6K SLoC

Cage:开发和部署复杂的 Docker 应用程序

Latest version License Build Status Build status Documentation Gitter

Logo

你的项目是否有很多 Docker 服务?是否有太多的 git 仓库?Cage 可以让你轻松地在本地开发复杂的、多服务应用程序。它与标准的 docker-compose.yml 文件和 docker-compose 一起工作,但可以帮助整理复杂性

  • Cage 提供了一种标准化的项目结构,就像 Rails 为 Web 开发所做的那样。
  • Cage 允许你使用多个源代码仓库,并混合预构建的 Docker 镜像与本地源代码。
  • Cage 去除了你的 docker-compose.yml 文件中的重复杂项。
  • Cage 提供了密钥管理,可以使用单个文本文件或 Hashicorp 的 Vault

有关 Cage 的更多信息,请参阅 入门网站

安装

首先,你需要 安装 Docker 并确保你有 至少版本 1.8.1 的 docker-compose

$ docker-compose --version
docker-compose version 1.8.1, build 878cff1

我们在发布页面提供了 Linux 和 MacOS 的 预构建的 cage 二进制文件。Linux 二进制文件是 静态链接的,应该可以在任何现代 Linux 发行版上运行。要安装,你可以直接解压二进制文件并将其复制到 /usr/local/bin

unzip cage-*.zip
sudo cp cage /usr/local/bin/
rm cage-*.zip cage

如果您想从源代码安装,我们建议使用rustupcargo install

curl https://sh.rustup.rs -sSf | sh
cargo install cage

如果您在使用cage的vault集成时遇到问题,请尝试使用cargo进行安装。

请注意,虽然可以为Windows构建cage,但它尚未得到官方支持。

尝试使用

使用cage创建一个新的应用程序

cage new myapp
cd myapp

拉取与此应用程序相关的预构建Docker镜像,并启动数据库pod

cage pull
cage up db

运行rake镜像来初始化您的数据库

cage run rake db:create
cage run rake db:migrate

然后启动应用程序的其他部分

cage up

让我们看看这个应用程序定义的pods和services

$ cage status
db enabled type:placeholder
└─ db
frontend enabled type:service
└─ web ports:3000
rake enabled type:task
└─ rake

这表明web服务正在监听端口3000,因此您应该能够通过https://127.0.0.1:3000访问应用程序。但是,让我们做一个改变!首先,列出此应用程序中services的可用的源代码

$ cage source ls
rails_hello               https://github.com/faradayio/rails_hello.git

尝试将rails_hello的源代码挂载到所有使用它的容器中

$ cage source mount rails_hello
$ cage up
$ cage source ls
rails_hello               https://github.com/faradayio/rails_hello.git
  Cloned at src/rails_hello (mounted)

您可能还会注意到,由于myapp_rake_1myapp_web_1基于相同的底层Git仓库,因此它也在适当的位置挂载了src/rails_hello。如果您在主机系统上更改源代码,它将自动出现在两个容器中。

现在,在src/rails_hello/public/index.html创建一个HTML文件

<html>
  <head><title>Sample page</title></head>
  <body><h1>Sample page</h1></body>
</html>

并在浏览器中重新加载网站。您应该看到新页面!

我们还可以运行容器特定的单元测试,这些测试由容器指定,这样您就可以调用您选择的任何单元测试框架

cage test web

并且我们可以使用可配置的shell访问单个容器

$ cage shell web
root@21bbbb41ad4a:/usr/src/app#

testshell之类的顶级便捷命令,使得在不了解单个容器如何工作的情况下执行标准开发任务变得更容易。

有关更多信息,请参阅cage的帮助

cage --help

什么是pod?

"pod"是一组紧密相连的容器,它们总是一起部署。Kubernetes 定义pods为

pod(如鲸鱼群或豌豆荚)是一组一个或多个容器(如Docker容器),这些容器的共享存储以及有关如何运行容器的选项。pods总是位于同一位置,并共同调度,在共享的上下文中运行。pod模拟了一个特定应用程序的“逻辑主机”——它包含一个或多个相对紧密耦合的应用程序容器——在一个容器之前的世界上,它们将在同一物理或虚拟机上执行。

如果您使用Amazon的ECS,pod对应于ECS的“任务”或“服务”。如果您使用Docker Swarm,pod对应于一个包含您始终作为一个单元启动的服务的单个docker-compose.xml文件。

pods通常使用普通DNS查找或服务发现与其他pods通信。如果pod接受外部网络连接,它通常会通过负载均衡器来做到这一点。

项目格式

有关完整示例,请参阅examples/hello

hello
└── pods
    ├── common.env
    ├── frontend.yml
    └── targets
        ├── development
        │   └── common.env
        ├── production
        │   ├── common.env
        │   └── frontend.yml
        └── test
            └── common.env

文件类型

文件名 描述 位于
common.env 在不同的级别设置环境变量。common是一个保留字。 顶级 pods/ 目录以及在目标目录中(例如 production 等)。
$服务.yml 有效的 docker-compose.yml 版本 2,定义镜像等。 顶级 pods/ 目录以及在目标目录中(例如 production 等)。
$服务.metadata.yml Pod级别的元数据,在 docker-compose.yml 版本 2 中无效。 顶级 pods/ 目录以及在目标目录中(例如 production 等)。

其他命令

cage run-script

run-script 命令与 npm run <script>rake <task> 类似。只需在Pod的元数据中定义一组命名的脚本。

# tasks.yml
services:
  runner:
    build: .
# tasks.metadata.yml

services:
  runner:
    scripts:
      populate:
        - ["npm","run","populate"]

通过运行 cage run-script populate,cage 将找到所有具有 populate 脚本的服务并运行它。您也可以使用 cage run-script tasks populate 指定Pod或服务。

报告问题

如果您遇到问题,设置以下shell变量并重新运行命令可能会有所帮助

export RUST_BACKTRACE=1 RUST_LOG=cage=debug,compose_yml=debug

开发笔记

欢迎提交拉取请求!如果您不确定自己的想法,请随时提交问题并寻求我们的反馈。我们喜欢建议!

设置工具

在处理此代码时,我们建议安装以下支持工具

rustup component add rustfmt
rustup component add clippy
cargo install cargo-watch

在编辑时,在终端中运行以下命令

cargo watch -x test

在提交代码之前,运行

cargo clippy
cargo fmt

这将自动检查警告,并根据项目约定重新格式化您的代码。我们使用Travis CI验证是否已运行 cargo fmt,以及项目是否无警告构建。如果失败,无需担心——只需继续修复您的拉取请求或向我们寻求帮助。

在MacOS上

openssl crate需要兼容版本的 openssl 库。您可能能够按以下方式安装它们

brew install openssl

官方版本

要创建官方版本,您必须是维护者,并且需要有 cargo publish 权限。如果是这种情况,首先编辑 Cargo.toml 以提高版本号,然后使用以下方式重新生成 Cargo.lock

cargo build

使用以下格式的提交信息提交发布

v<VERSION>: <SUMMARY>

<RELEASE NOTES>

然后运行

cargo publish
git tag v$VERSION
git push; git push --tags

这将使用Travis CI重新构建官方二进制文件,并将新版本的crate上传到 crates.io

依赖项

~54MB
~1M SLoC