前言

某一次本地 Docker Desktop for macOS 更新后,导致了开发环境服务无法成功启动,查看错误原因是 extends 的配置项被弃用。

因为我们的项目依赖的环境比较多,但是在本地开发、测试环境和生产环境中所用到的服务是不完全一样的,所以我想通过 extends 来更好的管理服务编排的文件。

版本对比

  • 开发语言:v1 是采用 Python 开发的,而 v2 则是彻底采用 Go 来开发的。我记得之前在服务器上升级 Docker Compose 的时候因为 Python 依赖的问题,整的我还挺头疼。现在好了,一个二进制文件下载下来就行了;

  • 组件化:Docker Compose 被作为 docker 命令的子命令以插件的方式即成到整个 Docker 生态中;

  • 去版本化:在 Docker Compose v1 中,docker-compose.yml 的开头必须声明 version,而在 v2 和 v3 中不在需要指定 version。可能是为了兼容 Swarm 吧。

应该使用那个版本?

我个人更加倾向于 v2,因为它较 v1 有明显的优势,当然 docker 团队也给出了兼容的方案,就是使用 Compose-Switch,来转译到 v2。

安装 Docker Compose v2

在 Windows 和 macOS 上,无需自己手动安装,在 Docker Desktop 中已经包含了,Linxu 单用户可以使用如下命令安装:

DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
(x)
curl -SL https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
(x)
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
(x)
docker compose version
(x)Docker Compose version v2.4.1

如果想全局安装,你可以将 docker-compose 放在下面四个目录中的任意一个:

  • /usr/local/lib/docker/cli-plugins
  • /usr/local/libexec/docker/cli-plugins
  • /usr/lib/docker/cli-plugins
  • /usr/libexec/docker/cli-plugins

Compose Switch

使用脚本自动安装

curl -fL https://raw.githubusercontent.com/docker/compose-switch/master/install_on_linux.sh | sh

手动安装

下载可执行文件

(x)# 下载可执行文件
curl -fL https://github.com/docker/compose-switch/releases/download/v1.0.4/docker-compose-linux-amd64 -o /usr/local/bin/compose-switch
(x)
(x)# 添加可执行权限
chmod +x /usr/local/bin/compose-switch

重命名 Docker Compose v1 的可执行文件

mv /usr/local/bin/docker-compose /usr/local/bin/docker-compose-v1

制作可替换的 Alias:

  • RHEL 系列的系统使用 alternatives 命令
  • Debian 系列系统使用 update-alternatives 命令

我这里用的是 CentOS 所以下面的命令都是 alternatives 来设置的。

alternatives --install /usr/local/bin/docker-compose docker-compose /usr/local/bin/docker-compose-v1 1
alternatives --install /usr/local/bin/docker-compose docker-compose /usr/local/bin/compose-switch 99

验证结果

$ alternatives --display docker-compose
(x)
(x)docker-compose - status is auto.
(x)link currently points to /usr/local/bin/compose-switch
(x)/usr/local/bin/docker-compose-v1 - priority 1
(x)/usr/local/bin/compose-switch - priority 99
(x)Current `best' version is /usr/local/bin/compose-switch.

切换版本

alternatives --config docker-compose
(x)
(x)There are 2 programs which provide 'docker-compose'.
(x)
(x)  Selection    Command
(x)-----------------------------------------------
(x)   1           /usr/local/bin/docker-compose-v1
(x)*+ 2           /usr/local/bin/compose-switch
(x)
(x)Enter to keep the current selection[+], or type selection number: 1
(x)# 验证是否切换成功
docker-compose version
(x)docker-compose version 1.29.2, build 5becea4c
(x)docker-py version: 5.0.0
(x)CPython version: 3.7.10
(x)OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

I hope this is helpful, Happy hacking…