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)
查看文档以获取有关如何指定多个撰写文件的更多详细信息。
我认为如果不编写脚本,您无法在本机 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/。