来自外部配置的多个绑定挂载

Multiple binds mounts from external config

我正在整理一些工具,这些工具需要访问分布在主机上不同位置的配置。

由于我无法控制的原因,不同的主机有不同的映射,所以我需要绑定挂载。

是否可以外部化挂载配置,以便我们可以为每个主机动态生成它?

我看过 docker-compose 使用 JSON 的示例,但找不到任何 docker 运行 等效项(docker-compose 是'不是我的用例的选项)。

我尝试了以下方法:

container-env.json:

    {
      "mounts" : [
        "type=bind,source=//c/Users/foo/.ssh,target=/root/.ssh,ro",
        "type=bind,source=//c/Users/foo/Projects/ops-tools,target=/root/ops-tools",
        "type=bind,source=//c/tmp/certs,target=/root/certs"
      ]
    }

docker run --env-file container-env.json...

但是 docker 抱怨错误“poorly formatted environment: variable '"mounts" : [' contains whitespaces.”,删除空格会抑制错误,但没有安装任何内容

您不能为此使用 --env-file - 那仅适用于环境变量。

我不知道有什么方法可以在 Docker 本地执行此操作,但您可以使用 Bash 和 jq 一起破解一些东西。这是一个将 JSON 文件转换为一系列挂载选项的命令:

< container-env.json jq -r '.mounts | map("--mount \"" + . + "\"") | join("\n")'

产生这个输出:

--mount "type=bind,source=//c/Users/foo/.ssh,target=/root/.ssh,ro"
--mount "type=bind,source=//c/Users/foo/Projects/ops-tools,target=/root/ops-tools"
--mount "type=bind,source=//c/tmp/certs,target=/root/certs"

以下是您在脚本中的使用方法。

#!/usr/bin/env bash
mount_options="$(< container-env.json jq -r '.mounts | map("--mount \"" + . + "\"") | join("\n")')"
docker run $mount_options <rest of command goes here>