tightenco/takeout

使用简单的单次Docker容器管理您的开发依赖。

安装次数: 18,798

依赖者: 0

建议者: 0

安全: 0

星标: 1,597

关注者: 22

分支: 83

开放问题: 16

类型:项目


README

Takeout - Docker-based dependency management

Takeout

Run tests Lint Latest Version on Packagist Downloads on Packagist

Takeout是一个用于启动小巧Docker容器的CLI工具,每个容器对应您开发环境中的一个依赖。

它旨在与Laravel Valet等工具配合使用。目前兼容macOS、Linux、Windows 10和WSL2。

使用takeout enable mysql运行MySQL,您再也不用担心管理或修复Homebrew MySQL了。

但您也可以通过简单的命令轻松启用ElasticSearch、PostgreSQL、MSSQL、Mongo、Redis等。查看此目录中可用的服务类,以获取当前服务列表:https://github.com/tighten/takeout/tree/main/app/Services

要求

安装

通过运行以下命令使用Composer安装Takeout:

composer global require "tightenco/takeout:~2.8"

确保~/.composer/vendor/bin目录已添加到系统“PATH”中。

使用方法

在终端的任何位置运行takeout,然后输入一个命令名。

Takeout的主要优势之一是它能够快速轻松地启动(“启用”)或删除(“禁用”)您的各种依赖项的Docker容器。

由于Docker提供持久卷存储,删除容器(我们称之为“禁用”)实际上并不会删除其数据。这意味着您可以无后顾之忧地启用和禁用服务。

启用服务

显示您可以启用的所有服务的列表。

takeout enable

启用特定服务

传入一个或多个服务的短名称,启用它们。

takeout enable mysql

takeout enable redis meilisearch

使用默认参数启用服务

如果您想跳过每个参数的提示并接受默认值。这也适用于一个命令中的多个服务。

takeout enable mysql --default

takeout enable redis meilisearch --default

透传容器参数

您可以在--分隔符之后指定容器的额外参数

takeout enable mysql -- -hsome.mysql.host -usome-user

请注意,这些是容器Entrypoint的参数,而不是额外的docker run选项(见下文)。

额外的docker run选项

在内部,takeout enable命令生成一个docker run命令。有时您可能想为docker run命令指定额外的选项,如额外的环境变量或额外的卷映射。您可以使用--run=选项传递包含所有额外docker run选项的字符串

takeout enable mysql --run="{docker-run-options}"

这将生成以下命令

docker run {docker-run-options} {service-options} mysql/mysql-server

其中{docker-run-options}是在--run选项内指定的选项,而{service-options}是基于该服务的默认选项生成的。

混合docker run选项与容器参数

您可以混合匹配run选项和容器参数

takeout enable mysql --run="{docker-run-options}" -- -hsome.mysql.host -usome-user

禁用服务

显示您可以禁用的所有已启用服务的列表。

takeout disable

禁用特定服务

传入一个或多个服务的短名称,禁用最接近的已启用服务。

takeout disable mysql

takeout disable redis meilisearch

禁用所有服务

takeout disable --all

启动已停止的容器

显示可以启动的所有已停止容器的列表。

takeout start

启动特定的已停止容器

传入一个或多个已停止容器的容器ID,启动匹配的已停止容器。

takeout start {container_id}

takeout start {container_id1} {container_id2}

启动所有容器

您可以使用 -all 标志来启动所有启用的容器。

takeout start --all

停止正在运行的容器

显示可以停止的所有正在运行的容器的列表。

takeout stop

停止特定的正在运行的容器

传入一个或多个正在运行的容器的容器ID,停止匹配的正在运行的容器。

takeout stop {container_id}

takeout stop {container_id1} {container_id2}

运行依赖关系的多个版本

Takeout的另一个好处是它允许您同时安装和运行依赖关系的多个版本。这意味着,例如,您可以在不同的端口上同时运行MySQL 5.7和8.0。

运行 takeout enable mysql 两次;第一次,您需要选择默认端口(3306)和第一个版本(5.7),第二次,您需要选择第二个端口(3307)、第二个版本(8.0)以及不同的卷名(这样它们不会共享相同的mysql_data)。

现在,如果您运行 takeout list,您将看到两个服务同时运行。

+--------------+----------------+---------------+-----------------------------------+
| CONTAINER ID | NAMES          | STATUS        | PORTS                             |
+--------------+----------------+---------------+-----------------------------------+
| 4bf3379ab2f5 | TO--mysql--5.7 | Up 2 seconds  | 33060/tcp, 0.0.0.0:3306->3306/tcp |
| 983acf46ceef | TO--mysql--8.0 | Up 35 seconds | 33060/tcp, 0.0.0.0:3307->3306/tcp |
+--------------+----------------+---------------+-----------------------------------+

网络详情

Takeout容器会自动添加到名为 takeout 的Docker网络中。这允许您使用与其他容器相同的别名和基本别名。

每个容器在该网络上分配两个别名

  • 基于核心依赖名称的基本别名(例如 mysql、postgres)
  • 结合基本别名和版本的完整别名(例如 mysql8.0、postgres13)

Takeout网络上的其他容器可以通过它们的别名访问Takeout容器。[查看这篇文章了解如何将sail和takeout一起使用](https://mattstauffer.com/blog/how-to-use-takeout-to-add-new-services-to-laravel-sail-and-save-ram/)

常见问题解答

这会通过PECL为我启用PHP驱动程序吗?

很遗憾,不会。

如果我禁用了服务,但Takeout仍然显示端口已被占用,我该怎么办?

首先,运行 lsof -i :3306(其中3306是不可用的端口)。

如果您看到如下输出

com.docke   936 mattstauffer   52u  IPv6 0xc0d6f0b06d5c4efb      0t0  TCP localhost:mysql->localhost:62919 (FIN_WAIT_2)
TablePlus 96155 mattstauffer   16u  IPv4 0xc0d6f0b0b6dccf6b      0t0  TCP localhost:62919->localhost:mysql (CLOSE_WAIT)

解决方案是只需关闭您的数据库GUI,然后它应该会被释放。

为什么您会使用这个而不是 `docker-compose`?

使用 docker-compose 会根据项目设置依赖关系,这是一种完全合理的方法。如果您认为在整个全局环境中对每个依赖项只有一个副本更有意义,那么Takeout更有意义。

禁用服务会永久删除我的数据库吗?

不!您的数据会保留!默认情况下,我们几乎所有的服务都使用“卷”来附加您的数据,正是出于这个原因。

所以,当您禁用MySQL服务时,例如,包含所有数据的这个卷将静静地坐在那里。当您重新启用时,只要您将其附加到相同的卷,所有数据仍然都在那里。

未来计划

查看我们的未来计划的最好方法是查看项目板,但以下是一些未来的计划

  • 基于Electron的GUI
  • self-remove 命令:删除所有启用的服务,然后可能自行卸载?
  • upgrade:销毁旧容器,启动一个带有新指定标签的新容器(提示用户输入,默认为latest)并保持所有其他参数(例如端口、卷)与旧容器完全相同
  • pt/passthrough:通过docker代理命令(./takeout pt mysql stop
  • 以对非PHP开发者友好的方式交付软件包(Homebrew?NPM?)
  • 允许其他人通过添加自己的插件来扩展外卖功能(感谢@angrybrad提出的想法!)

发布流程

如果您正在与我们合作,并被分配发布任务,以下是最简单的流程

  1. 访问外卖发布页面;确定您的下一个标签将是什么(如果是补丁或修复,则增加第三个数字;如果添加功能,则增加第二个数字)
  2. 在您的本地机器上,拉取最新的main版本(git checkout main && git pull
  3. 为您的目标版本进行构建(php ./takeout app:build
  4. 运行构建一次以确保它正常工作(php ./builds/takeout list
  5. 提交您的构建并将其推送到服务器
  6. 草拟一个新发布,包含您的标签版本和发布标题(例如v1.5.1
  7. 使用“生成发布说明”按钮从合并的PR中生成发布说明。
  8. 点击发布发布
  9. 盈利😆