如何使用 Bash 合并 Docker Compose 文件

pub*_*tml 8 bash shell docker docker-compose

我正在尝试使用 bash 将 docker-compose.yml 文件与 docker-compose2.yml 文件合并。

docker-compose.yml :

version: "3"

services:
  nexus:
    image: sonatype/nexus3
    volumes:
      - "/opt/nexus3/nexus-data:/nexus-data"
    ports:
      - "8081:8081"

volumes:
  nexus-data: {}
Run Code Online (Sandbox Code Playgroud)

docker-compose2.yml :

version: "3"

services:
  nexus2:
    image: sonatype/nexus3
    volumes:
      - "/opt/nexus3/nexus-data:/nexus-data"
    ports:
      - "8082:8082"

volumes:
  nexus-data: {}
Run Code Online (Sandbox Code Playgroud)

我想要的输出:

version: "3"

services:
  nexus:
    image: sonatype/nexus3
    volumes:
      - "/opt/nexus3/nexus-data:/nexus-data"
    ports:
      - "8081:8081"

  nexus2:
    image: sonatype/nexus3
    volumes:
      - "/opt/nexus3/nexus-data:/nexus-data"
    ports:
      - "8082:8082"
volumes:
  nexus-data: {}
Run Code Online (Sandbox Code Playgroud)

如何使用 bash 获得此输出?

bug*_*bug 20

Docker Compose config 命令完全符合您的需求,它需要多个撰写文件并合并它们。

只需使用多个-f标志传递它们:

docker-compose -f docker-compose.yml -f docker-compose2.yml config
Run Code Online (Sandbox Code Playgroud)

或使用环境变量:

COMPOSE_FILE=docker-compose.yml:docker-compose2.yml docker-compose config
Run Code Online (Sandbox Code Playgroud)

同样的方法对每个 Docker Compose 命令都有效,所以如果你的最终目标是,例如,设置你的项目,你可以直接运行:

docker-compose -f docker-compose.yml -f docker-compose2.yml up
Run Code Online (Sandbox Code Playgroud)

查看文档以获取有关如何指定多个撰写文件的更多详细信息。


lee*_*n24 4

我认为如果不编写脚本,您无法在本机 bash 中完成此操作(轻松地作为一行)。我很好奇,所以我快速搜索了一下,发现了一个 yaml 操作工具,它支持合并 yaml (docker-compose) 文件,并且看起来适合您的用例。

我曾经brew在 MacOS 上安装,但也有针对 Linux 的说明 - https://mikefarah.github.io/yq/

brew install yq
Run Code Online (Sandbox Code Playgroud)

显示现有文件:

$ cat file1.yaml
version: "3"

services:
  nexus:
    image: sonatype/nexus3
    volumes:
      - "/opt/nexus3/nexus-data:/nexus-data"
    ports:
      - "8081:8081"

volumes:
  nexus-data: {}

$ cat file2.yaml
version: "3"

services:
  nexus2:
    image: sonatype/nexus3
    volumes:
      - "/opt/nexus3/nexus-data:/nexus-data"
    ports:
      - "8082:8082"

volumes:
  nexus-data: {}
Run Code Online (Sandbox Code Playgroud)

合并两个文件输出到 stdout:

$ yq m file1.yaml file2.yaml
services:
  nexus:
    image: sonatype/nexus3
    ports:
    - 8081:8081
    volumes:
    - /opt/nexus3/nexus-data:/nexus-data
  nexus2:
    image: sonatype/nexus3
    ports:
    - 8082:8082
    volumes:
    - /opt/nexus3/nexus-data:/nexus-data
version: "3"
volumes:
  nexus-data: {}
Run Code Online (Sandbox Code Playgroud)

可能有一种本机方式,但我只是将标准输出重定向到一个文件:

$ yq m file1.yaml file2.yaml > file3.yaml
$ cat file3.yaml
services:
  nexus:
    image: sonatype/nexus3
    ports:
    - 8081:8081
    volumes:
    - /opt/nexus3/nexus-data:/nexus-data
  nexus2:
    image: sonatype/nexus3
    ports:
    - 8082:8082
    volumes:
    - /opt/nexus3/nexus-data:/nexus-data
version: "3"
volumes:
  nexus-data: {}
Run Code Online (Sandbox Code Playgroud)

他们的文档中有很多示例供您探索 - https://mikefarah.github.io/yq/merge/